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

資訊專欄INFORMATION COLUMN

Yii源碼解讀-行為

IntMain / 2240人閱讀

摘要:行為所要響應(yīng)的事件重載方法,表示這個行為將對類何種事件進(jìn)行何種反饋。行為用的最多的,也是對于各種事件的響應(yīng)。當(dāng)出現(xiàn)命名沖突時,行為會自行排除沖突,自動使用先綁定的行為。目前還沒有能支持行為。

Yii基礎(chǔ) 行為(Behavior)

行為(behavior)可以在不修改現(xiàn)有類的情況下,對類的功能進(jìn)行擴(kuò)充。 通過將行為綁定到一個類,可以使類具有行為本身所定義的屬性和方法,就好像類本來就有這些屬性和方法一樣。 而且不需要寫一個新的類去繼承或包含現(xiàn)有類。

Yii中的行為,是yiiaseBehavior中的實(shí)例,只要將Behavior實(shí)例綁定到Component實(shí)例上即可。但是,Behavior只能與Component類綁定。

如果你寫了一個類,需要用到行為,那么必須要繼承自yiiaseComponent。

使用行為

Demo:

// 定義一個將綁定行為的類
class MyClass extends yiiaseComponent{}

//定義一個行為類,他將綁定到MyClass上
class MyBehavior extends yiiaseBehavior{
    public $property1 = "This is property in MyBehavior.";
    
    public function method1(){
        return "Method in MyBehavior is called.";
    }
}

$myClass = new MyClass();
$myBehavior = new MyBehavior();

// Bind
$myClass->attachBehavior("myBehavior", $myBehavior);

// 訪問
echo $myClass->property1;
echo $myClass->method1();

使用行為的大致流程:

yiiaseComponent派生自己的類,以便使用行為。

yiiaseBehavior派生自己的行為類,定義屬性和方法。

將Component和Behavior綁定起來

像使用Behavior一樣使用Component

行為的要素

$owner:指向行為的依附對象

events():行為所有要響應(yīng)的事件

attach():將行為與Component綁定起來

detach():你懂的

行為的依附對象

在行為的方法中, $this 引用的是行為本身, 試圖通過 $this 來訪問行為所依附的Component是行不通的。 正確的方法是通過yiiaseBehavior::$owner來訪問Component。

行為所要響應(yīng)的事件

重載yiiaseBehavior::events()方法,表示這個行為將對類何種事件進(jìn)行何種反饋。

namespace appComponents;

use yiidbActiveRecord;
use yiiaseBehavior;

class MyBehavior extends Behavior{
    // 重載,使得事件觸發(fā)時,調(diào)用行為中的一些方法
    public function events(){
        // 在AR的這個事件觸發(fā)時,調(diào)用成員函數(shù)beforeValidate
        return [ActiveRecord::EVENT_BEFORE_VALIDATE => "beforeValidate"]
    }
    
    // 行為的成員函數(shù)
    public function beforeValidate($events){...}
}
行為的綁定和解除

綁定和解除,均需要行為和Component雙方共同參與才行。

實(shí)際操作,Behavior分別使用attach()detach()來實(shí)現(xiàn)即可。

定義一個行為

定義一個行為,即是準(zhǔn)備好注入到現(xiàn)有類的屬性和方法。即要寫一個Behavior的子類

namespace appComponents;
use yiiaseBehavior;

class MyBehavior extends Behavior{
    public $prop1;
    
    private $_prop2;
    private $_prop3;
    private $_prop4;
    
    public function getProp2(){
        return $this->prop2;
    }
    
    public function setProp3($value){
        $this->_prop3 = $value;
    }
    
    public function foo(){}
    
    protected function bar(){}
}

該子類繼承了Behavior,同時間接的繼承了Object。當(dāng)該類與Component綁定后,Component也就擁有了相對應(yīng)public的屬性和方法,而private和protected的屬性和方法并不能得到。

行為的綁定

有兩種方法可以將一個Behavior綁定到一個yiiaseComponent上。

靜態(tài)方法:在代碼沒有跑起來之前

靜態(tài)綁定,只需要重載yiiaseComponent::bahaviors()就可以了。該方法描述類所具有的行為。描述方法:

配置來描述

Behavior類名

Behavior類的配置數(shù)組

namespace appmodels;
use yiidbActiveRecord;
use appComponentsMyBehavior;

class User extends ActiveRecord{
    public function behaviors(){
        return [
            // 匿名行為
            MyBehavior::className(),
            // 名為myBehavior2的行為
            "myBehavior2" => MyBehavior::className(),
            // 匿名行為 + 給出配置數(shù)組
            [
                "class" => MyBehavior::className(),
                "prop1" => "v1",
                "prop3" => "v3",
            ],
            // 帶名稱的行為 + 配置數(shù)組
            "myBehavior4" => [
                "class" => MyBehavior::className(),
                "prop1" => "v1",
                "prop3" => "v3"
            ]
        ];
    }
}

另外通過配置文件:

[
    "as myBehavior2" => MyBehavior::className(),
]
動態(tài)方法綁定行為

需要調(diào)用yiiaseComponent::attachBehaviors()

$Component->attachBehaviors([
    "myBehavior1" => new MyBehavior,
]);
$behavior = $Component->getBehavior("myBehavior1");
綁定的內(nèi)部原理

yiiaseComponent::behaviors()

yiiaseComponent::ensureBehaviors()

yiiaseComponent::attachBehaviorInternal()

yiiaseBehavior::attach()

關(guān)于綁定,做個小結(jié):

綁定的動作從Component發(fā)起;

靜態(tài)綁定通過重載 yiiaseComponet::behaviors() 實(shí)現(xiàn);

動態(tài)綁定通過調(diào)用 yiiaseComponent::attachBehaviors() 實(shí)現(xiàn);

行為還可以通過為 Component 配置 as 配置項(xiàng)進(jìn)行綁定;

行為有匿名行為和命名行為之分,區(qū)別在于綁定時是否給出命名。 命名行為可以通過其命名進(jìn)行標(biāo)識,從而有針對性地進(jìn)行解除等操作;

綁定過程中,后綁定的行為會取代已經(jīng)綁定的同名行為;

綁定的意義有兩點(diǎn),一是為行為設(shè)置 $owner 。二是將行為中擬響應(yīng)的事件的handler綁定到類中去。

行為響應(yīng)的事件實(shí)例

綁定和解除的過程,實(shí)際上就是將行為中的事件handler綁定到類中去。行為用的最多的,也是對于Component各種事件的響應(yīng)。

行為的屬性和方法注入原理

__get(), __set(), __call()

行為與繼承和特性(Traits)的區(qū)別

相比較于使用繼承的方式來擴(kuò)充類功能,使用行為的方式,一是不必對現(xiàn)有類進(jìn)行修改,二是PHP不支持多繼承,但是Yii可以綁定多個行為,從而達(dá)到類似多繼承的效果。

傾向于使用行為的情況:

行為從本質(zhì)上講,也是PHP的類,因此一個行為可以繼承自另一個行為,從而實(shí)現(xiàn)代碼的復(fù)用。而特性只是PHP的一種語法,效果上類似于把特性的代碼導(dǎo)入到了類中從而實(shí)現(xiàn)代碼的注入,特性是不支持繼承的。

行為可以動態(tài)地綁定、解除,而不必要對類進(jìn)行修改。但是特性必須在類在使用 use 語句,要解除特性時,則要刪除這個語句。換句話說,需要對類進(jìn)行修改。

行為還以在在配置階段進(jìn)行綁定,特性就不行了。

行為可以用于對事件進(jìn)行反饋,而特性不行。

當(dāng)出現(xiàn)命名沖突時,行為會自行排除沖突,自動使用先綁定的行為。而特性在發(fā)生沖突時,需要人為干預(yù),修改發(fā)生沖突的變量名、屬性名、方法名。

傾向于使用特性的情況:

特性比行為在效率上要高一點(diǎn),因?yàn)樾袨槠鋵?shí)是類的實(shí)例,需要時間和空間進(jìn)行分配。

特性是PHP的語法,因此,IDE的支持要好一些。目前還沒有IDE能支持行為。

參考

http://www.digpage.com/behavior.html

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

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

相關(guān)文章

  • Yii源碼解讀-環(huán)境&配置

    摘要:環(huán)境需要了解一下一個純粹的與本地環(huán)境密切相關(guān)的配置項(xiàng)。對于配置項(xiàng)以數(shù)組進(jìn)行組織。數(shù)組元素表示將要創(chuàng)建的對象的完整類名。數(shù)組元素表示指定為屬性的初始值為。數(shù)組元素表示將綁定到對象的事件中。對于形式配置項(xiàng),視配置值為一個事件,綁定到上。 環(huán)境 需要了解一下cookieValidationKey:一個純粹的、與本地環(huán)境密切相關(guān)的配置項(xiàng)。 但是,在有些情況下,cookieValidationK...

    cgh1999520 評論0 收藏0
  • Yii源碼解讀-屬性

    摘要:成員變量可以視為一個可讀可寫沒有任何預(yù)處理或后處理的屬性。而成員變量由于外部不可見,與屬性外的特性不相符,所以不能視為屬性。在一些表示數(shù)據(jù)結(jié)構(gòu)數(shù)據(jù)集合等簡單情況下,且不需讀寫控制等,可以考慮使用成員變量作為屬性,這樣可以提高一點(diǎn)效率。 Yii基礎(chǔ) 屬性 property 屬性用于表征類的狀態(tài),從訪問的形式上看,屬性與成員變量沒有區(qū)別。但是,成員變量是就類的結(jié)構(gòu)構(gòu)成而言的概念,而屬性是就...

    instein 評論0 收藏0
  • Yii源碼解讀 - 事件

    摘要:事件的綁定和解除對事件進(jìn)行綁定和解綁。使用全局函數(shù)作為來進(jìn)行綁定使用對象的成員函數(shù)來進(jìn)行綁定使用類的靜態(tài)成員函數(shù)進(jìn)行綁定使用匿名函數(shù)上面的數(shù)組是用來維護(hù)事件數(shù)組。事件的級別類級別事件類級別事件用于響應(yīng)所有類實(shí)例的事件。 Yii基礎(chǔ) 事件 event 使用事件,可以在特定的時點(diǎn),觸發(fā)執(zhí)行預(yù)先設(shè)定的一段代碼,事件既是代碼解耦的一種方式,也是設(shè)計(jì)業(yè)務(wù)流程的一種模式。 事件的相關(guān)要素 這是一...

    AaronYuan 評論0 收藏0
  • Yii源碼解讀-別名

    摘要:設(shè)置別名的目的特殊的變量常量保存整個應(yīng)用的所有別名。別名的解析過程先按根別名找到可能保存別名的分支。別名必然以打頭。別名解析時,優(yōu)先匹配較長的別名。使用別名時,要將別名放在最前面,不能放在中間。 Alias 設(shè)置別名的目的:特殊的變量常量 yiiBaseYii::$aliases保存整個Yii應(yīng)用的所有別名。 在yiiaseApplication的構(gòu)造函數(shù)__construct()中...

    banana_pi 評論0 收藏0
  • Yii源碼解讀-類自動加載

    摘要:實(shí)現(xiàn)的類自動加載,依賴于的,注冊一個自己的自動加載函數(shù),并插入到自動加載函數(shù)棧的最前面,確保的會被最先調(diào)用。首先加載第三方的,再加載的。最后加載的,這樣可以保證的優(yōu)先加載。 實(shí)現(xiàn) Yii的類自動加載,依賴于PHP的spl_autoload_register(), 注冊一個自己的自動加載函數(shù)(autoloader),并插入到自動加載函數(shù)棧的最前面,確保Yii的autoloader會被最先...

    Jeffrrey 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<