摘要:概念理解第一次看深入理解的時候,我也是懵逼的,屬性不就是類的屬性嗎,有什么好說的。屬性的實現(xiàn)步驟繼承自。聲明一個用于保存該屬性的私有成員變量。如果只提供了,那么該屬性為只讀屬性,只提供了,則為只寫。
概念理解:第一次看深入理解Yii2.0的時候,我也是懵逼的,屬性不就是類的屬性嗎,有什么好說的。后來才知道Yii框架對成員變量和屬性做了區(qū)分,那類的成員變量和屬性到底是什么關(guān)系又有什么區(qū)別呢?先看一下比較書面化的說法,"成員變量是就類的結(jié)構(gòu)構(gòu)成而言的概念,而屬性是就類的功能邏輯而言的概念,兩者緊密聯(lián)系又相互區(qū)別"。說白點就是屬性是業(yè)務(wù)上抽象出來的概念,并且屬性的代碼實現(xiàn)依賴于成員變量,但不能說屬性就是成員變量,(好像也不是很直白...)并且屬性在代碼上可以做到控制讀寫權(quán)限,而成員變量就不可以了。屬性的實現(xiàn)步驟
繼承自 yiiaseBaseObject 。
聲明一個用于保存該屬性的私有成員變量。
提供getter或setter函數(shù),或兩者都提供,用于訪問、修改上面提到的私有成員變量。 如果只提供了getter,那么該屬性為只讀屬性,只提供了setter,則為只寫。
屬性的實現(xiàn)demo_val; } //控制屬性寫權(quán)限的方法 public function setTitle($value) { $this->_val = $value; } } $obj = new Article(); //獲取屬性文章標題的值 $obj->title; //設(shè)置屬性文章標題的值 $obj->title = "mysql從入門到刪庫";
注意: 上述demo中,$_val 就是成員變量 title 就是一個抽象出來的業(yè)務(wù)屬性。 從Yii2.0.13以后推薦繼承的是 yiiaseBaseObject,而不是 yiiaseObject 因為在 php7.2 以后 Object 是保留字,不能再作為類名
那么Yii是怎么通過getTitle()和setTitle()函數(shù)來控制屬性title的讀寫的呢?其實很簡單,通過__get()和__set()倆個魔術(shù)方法來實現(xiàn)的。
屬性的實現(xiàn)原理下面是類BaseObject里面對于__set()和__get()魔術(shù)方法的實現(xiàn)。
public function __get($name) { $getter = "get" . $name; if (method_exists($this, $getter)) { return $this->$getter(); } elseif (method_exists($this, "set" . $name)) { throw new InvalidCallException("Getting write-only property: " . get_class($this) . "::" . $name); } throw new UnknownPropertyException("Getting unknown property: " . get_class($this) . "::" . $name); } public function __set($name, $value) { $setter = "set" . $name; if (method_exists($this, $setter)) { $this->$setter($value); } elseif (method_exists($this, "get" . $name)) { throw new InvalidCallException("Setting read-only property: " . get_class($this) . "::" . $name); } else { throw new UnknownPropertyException("Setting unknown property: " . get_class($this) . "::" . $name); } }
當我們讀取類Article實例里面title值的時候,會去遍歷類Article里面的屬性,找不到匹配的屬性的時候,就會自動觸發(fā)__get()魔術(shù)方法[注:當調(diào)用當前環(huán)境下未定義或不可見的類屬性時自動觸發(fā)],在__get()方法里再去調(diào)用getTitle()方法。設(shè)置屬性title同理。[注:由于PHP對于類方法不區(qū)分大小寫,即大小寫不敏感, $obj->getTitle() 和 $obj->gettitle() 是調(diào)用相同的函數(shù)]
小結(jié)以上總結(jié)參考了深入理解Yii2.0[這次可能參考的比較多,嘿嘿],其實以前就看過,但是也只是局限于看過,沒有自己跑demo調(diào)試、查看源代碼,然后就誤以為自己明白了,其實過倆天什么都不記得了。所以現(xiàn)在通過寫博客來加深自己的理解,由于水平有限,歡迎小伙伴交流和指正。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/31585.html
摘要:概念理解使用行為可以在不修改現(xiàn)有類的情況下,對類的功能進行擴充。最后將行為名稱和行為實例放到的屬性中,至此,行為的綁定就結(jié)束了。不過在解除的時候雖然都是刪掉相應(yīng)的,但是解除行為還需要解除在綁定行為的時候綁定的事件,這點不太一樣。 概念理解:使用行為(behavior)可以在不修改現(xiàn)有類的情況下,對類的功能進行擴充。 通過將行為綁定到一個類,可以使類具有行為本身所定義的屬性和方法,就好像...
摘要:全局級別利用實例在整個應(yīng)用的生命周期中全局可訪問的特性,來實現(xiàn)這個全局事件的。類級別通過維護類的屬性數(shù)組,觸發(fā)事件時通過類名和事件名稱取到當前類以及父類的數(shù)據(jù),再通過函數(shù)觸發(fā)。 概念理解:在某一個事件(trigger)發(fā)生的時候,觸發(fā)預(yù)先設(shè)定(on)的代碼,這是代碼解耦的一種方式。 事件按照級別分為三類 1. 實例級別 綁定事件、觸發(fā)事件的類繼承的是Component,只在當前示例中運...
摘要:再看看另一個方法,的提供的數(shù)據(jù)統(tǒng)計總條數(shù)的方法是的,默認計算分頁總數(shù)是根據(jù)數(shù)組計算的,而的數(shù)據(jù)就是我們查詢賦值給提供器的。統(tǒng)計總數(shù)預(yù)處理函數(shù)直接獲取通過函數(shù)獲取傳遞給數(shù)據(jù)提供器的數(shù)據(jù)總和。 首先看看ArrayDataProvider官方的doc: ArrayDataProvider implements a data provider based on a data array.Ar...
摘要:響應(yīng)式原理之不論如何,最終響應(yīng)式數(shù)據(jù)都要通過來實現(xiàn),實際要借助新增的。在函數(shù)內(nèi),首先實例化一個實例,會在稍后添加為響應(yīng)式數(shù)據(jù)自定義的中發(fā)揮作用。只有數(shù)組和對象才可能是響應(yīng)式,才能返回實例。參考鏈接技術(shù)內(nèi)幕揭開數(shù)據(jù)響應(yīng)系統(tǒng)的面紗源碼 Vue響應(yīng)式原理之defineReactive defineReactive 不論如何,最終響應(yīng)式數(shù)據(jù)都要通過defineReactive來實現(xiàn),實際要借助...
摘要:有需要還可以修改指向謙龍寄生組合式繼承思路是通過借用構(gòu)造函數(shù)來繼承屬性,通過原型鏈的混合形式來繼承方法改變執(zhí)行環(huán)境實現(xiàn)繼承有需要還可以修改指向謙龍謙龍拷貝繼承該方法思路是將另外一個對象的屬性和方法拷貝至另一個對象使用遞歸 前言 js中實現(xiàn)繼承的方式只支持實現(xiàn)繼承,即繼承實際的方法,而實現(xiàn)繼承主要是依靠原型鏈來完成的。 原型鏈式繼承 該方式實現(xiàn)的本質(zhì)是重寫原型對象,代之以一個新類型的實例...
閱讀 826·2023-04-26 02:03
閱讀 1158·2021-11-23 09:51
閱讀 1327·2021-10-14 09:42
閱讀 1871·2021-09-13 10:23
閱讀 1107·2021-08-27 13:12
閱讀 986·2019-08-30 11:21
閱讀 1130·2019-08-30 11:14
閱讀 1177·2019-08-30 11:09