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