成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

淺析Yii2.0的屬性Property

arashicage / 1711人閱讀

摘要:概念理解第一次看深入理解的時(shí)候,我也是懵逼的,屬性不就是類(lèi)的屬性嗎,有什么好說(shuō)的。屬性的實(shí)現(xiàn)步驟繼承自。聲明一個(gè)用于保存該屬性的私有成員變量。如果只提供了,那么該屬性為只讀屬性,只提供了,則為只寫(xiě)。

概念理解:第一次看深入理解Yii2.0的時(shí)候,我也是懵逼的,屬性不就是類(lèi)的屬性嗎,有什么好說(shuō)的。后來(lái)才知道Yii框架對(duì)成員變量和屬性做了區(qū)分,那類(lèi)的成員變量和屬性到底是什么關(guān)系又有什么區(qū)別呢?先看一下比較書(shū)面化的說(shuō)法,"成員變量是就類(lèi)的結(jié)構(gòu)構(gòu)成而言的概念,而屬性是就類(lèi)的功能邏輯而言的概念,兩者緊密聯(lián)系又相互區(qū)別"。說(shuō)白點(diǎn)就是屬性是業(yè)務(wù)上抽象出來(lái)的概念,并且屬性的代碼實(shí)現(xiàn)依賴(lài)于成員變量,但不能說(shuō)屬性就是成員變量,(好像也不是很直白...)并且屬性在代碼上可以做到控制讀寫(xiě)權(quán)限,而成員變量就不可以了。
屬性的實(shí)現(xiàn)步驟

繼承自 yiiaseBaseObject 。

聲明一個(gè)用于保存該屬性的私有成員變量。

提供gettersetter函數(shù),或兩者都提供,用于訪問(wèn)、修改上面提到的私有成員變量。 如果只提供了getter,那么該屬性為只讀屬性,只提供了setter,則為只寫(xiě)。

屬性的實(shí)現(xiàn)demo
_val;
    }

    //控制屬性寫(xiě)權(quán)限的方法
    public function setTitle($value)
    {
        $this->_val = $value;
    }
}

$obj = new Article();

//獲取屬性文章標(biāo)題的值
$obj->title;                            

//設(shè)置屬性文章標(biāo)題的值
$obj->title = "mysql從入門(mén)到刪庫(kù)";        
        
注意:

上述demo中,$_val 就是成員變量 title 就是一個(gè)抽象出來(lái)的業(yè)務(wù)屬性。

從Yii2.0.13以后推薦繼承的是 yiiaseBaseObject,而不是 yiiaseObject 因?yàn)樵?php7.2 以后 Object 是保留字,不能再作為類(lèi)名

那么Yii是怎么通過(guò)getTitle()setTitle()函數(shù)來(lái)控制屬性title的讀寫(xiě)的呢?其實(shí)很簡(jiǎn)單,通過(guò)__get()__set()倆個(gè)魔術(shù)方法來(lái)實(shí)現(xiàn)的。

屬性的實(shí)現(xiàn)原理

下面是類(lèi)BaseObject里面對(duì)于__set()__get()魔術(shù)方法的實(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);
        }
    }
    

當(dāng)我們讀取類(lèi)Article實(shí)例里面title值的時(shí)候,會(huì)去遍歷類(lèi)Article里面的屬性,找不到匹配的屬性的時(shí)候,就會(huì)自動(dòng)觸發(fā)__get()魔術(shù)方法[注:當(dāng)調(diào)用當(dāng)前環(huán)境下未定義或不可見(jiàn)的類(lèi)屬性時(shí)自動(dòng)觸發(fā)],在__get()方法里再去調(diào)用getTitle()方法。設(shè)置屬性title同理。[注:由于PHP對(duì)于類(lèi)方法不區(qū)分大小寫(xiě),即大小寫(xiě)不敏感, $obj->getTitle() 和 $obj->gettitle() 是調(diào)用相同的函數(shù)]

小結(jié)

以上總結(jié)參考了深入理解Yii2.0[這次可能參考的比較多,嘿嘿],其實(shí)以前就看過(guò),但是也只是局限于看過(guò),沒(méi)有自己跑demo調(diào)試、查看源代碼,然后就誤以為自己明白了,其實(shí)過(guò)倆天什么都不記得了。所以現(xiàn)在通過(guò)寫(xiě)博客來(lái)加深自己的理解,由于水平有限,歡迎小伙伴交流和指正。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/31585.html

相關(guān)文章

  • 淺析Yii2.0行為Behavior

    摘要:概念理解使用行為可以在不修改現(xiàn)有類(lèi)的情況下,對(duì)類(lèi)的功能進(jìn)行擴(kuò)充。最后將行為名稱(chēng)和行為實(shí)例放到的屬性中,至此,行為的綁定就結(jié)束了。不過(guò)在解除的時(shí)候雖然都是刪掉相應(yīng)的,但是解除行為還需要解除在綁定行為的時(shí)候綁定的事件,這點(diǎn)不太一樣。 概念理解:使用行為(behavior)可以在不修改現(xiàn)有類(lèi)的情況下,對(duì)類(lèi)的功能進(jìn)行擴(kuò)充。 通過(guò)將行為綁定到一個(gè)類(lèi),可以使類(lèi)具有行為本身所定義的屬性和方法,就好像...

    legendmohe 評(píng)論0 收藏0
  • 淺析Yii2.0事件Event

    摘要:全局級(jí)別利用實(shí)例在整個(gè)應(yīng)用的生命周期中全局可訪問(wèn)的特性,來(lái)實(shí)現(xiàn)這個(gè)全局事件的。類(lèi)級(jí)別通過(guò)維護(hù)類(lèi)的屬性數(shù)組,觸發(fā)事件時(shí)通過(guò)類(lèi)名和事件名稱(chēng)取到當(dāng)前類(lèi)以及父類(lèi)的數(shù)據(jù),再通過(guò)函數(shù)觸發(fā)。 概念理解:在某一個(gè)事件(trigger)發(fā)生的時(shí)候,觸發(fā)預(yù)先設(shè)定(on)的代碼,這是代碼解耦的一種方式。 事件按照級(jí)別分為三類(lèi) 1. 實(shí)例級(jí)別 綁定事件、觸發(fā)事件的類(lèi)繼承的是Component,只在當(dāng)前示例中運(yùn)...

    李義 評(píng)論0 收藏0
  • 重寫(xiě)yii2數(shù)據(jù)提供器ArrayDataProvider類(lèi)

    摘要:再看看另一個(gè)方法,的提供的數(shù)據(jù)統(tǒng)計(jì)總條數(shù)的方法是的,默認(rèn)計(jì)算分頁(yè)總數(shù)是根據(jù)數(shù)組計(jì)算的,而的數(shù)據(jù)就是我們查詢(xún)賦值給提供器的。統(tǒng)計(jì)總數(shù)預(yù)處理函數(shù)直接獲取通過(guò)函數(shù)獲取傳遞給數(shù)據(jù)提供器的數(shù)據(jù)總和。 首先看看ArrayDataProvider官方的doc: ArrayDataProvider implements a data provider based on a data array.Ar...

    xiaokai 評(píng)論0 收藏0
  • 淺析Vue響應(yīng)式原理(三)

    摘要:響應(yīng)式原理之不論如何,最終響應(yīng)式數(shù)據(jù)都要通過(guò)來(lái)實(shí)現(xiàn),實(shí)際要借助新增的。在函數(shù)內(nèi),首先實(shí)例化一個(gè)實(shí)例,會(huì)在稍后添加為響應(yīng)式數(shù)據(jù)自定義的中發(fā)揮作用。只有數(shù)組和對(duì)象才可能是響應(yīng)式,才能返回實(shí)例。參考鏈接技術(shù)內(nèi)幕揭開(kāi)數(shù)據(jù)響應(yīng)系統(tǒng)的面紗源碼 Vue響應(yīng)式原理之defineReactive defineReactive 不論如何,最終響應(yīng)式數(shù)據(jù)都要通過(guò)defineReactive來(lái)實(shí)現(xiàn),實(shí)際要借助...

    tomener 評(píng)論0 收藏0
  • js面向?qū)ο?em>淺析--繼承那些事

    摘要:有需要還可以修改指向謙龍寄生組合式繼承思路是通過(guò)借用構(gòu)造函數(shù)來(lái)繼承屬性,通過(guò)原型鏈的混合形式來(lái)繼承方法改變執(zhí)行環(huán)境實(shí)現(xiàn)繼承有需要還可以修改指向謙龍謙龍拷貝繼承該方法思路是將另外一個(gè)對(duì)象的屬性和方法拷貝至另一個(gè)對(duì)象使用遞歸 前言 js中實(shí)現(xiàn)繼承的方式只支持實(shí)現(xiàn)繼承,即繼承實(shí)際的方法,而實(shí)現(xiàn)繼承主要是依靠原型鏈來(lái)完成的。 原型鏈?zhǔn)嚼^承 該方式實(shí)現(xiàn)的本質(zhì)是重寫(xiě)原型對(duì)象,代之以一個(gè)新類(lèi)型的實(shí)例...

    molyzzx 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<