摘要:行為所要響應的事件重載方法,表示這個行為將對類何種事件進行何種反饋。行為用的最多的,也是對于各種事件的響應。當出現命名沖突時,行為會自行排除沖突,自動使用先綁定的行為。目前還沒有能支持行為。
Yii基礎 行為(Behavior)
行為(behavior)可以在不修改現有類的情況下,對類的功能進行擴充。 通過將行為綁定到一個類,可以使類具有行為本身所定義的屬性和方法,就好像類本來就有這些屬性和方法一樣。 而且不需要寫一個新的類去繼承或包含現有類。
Yii中的行為,是yiiaseBehavior中的實例,只要將Behavior實例綁定到Component實例上即可。但是,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():行為所有要響應的事件
attach():將行為與Component綁定起來
detach():你懂的
行為的依附對象在行為的方法中, $this 引用的是行為本身, 試圖通過 $this 來訪問行為所依附的Component是行不通的。 正確的方法是通過yiiaseBehavior::$owner來訪問Component。
行為所要響應的事件重載yiiaseBehavior::events()方法,表示這個行為將對類何種事件進行何種反饋。
namespace appComponents; use yiidbActiveRecord; use yiiaseBehavior; class MyBehavior extends Behavior{ // 重載,使得事件觸發時,調用行為中的一些方法 public function events(){ // 在AR的這個事件觸發時,調用成員函數beforeValidate return [ActiveRecord::EVENT_BEFORE_VALIDATE => "beforeValidate"] } // 行為的成員函數 public function beforeValidate($events){...} }行為的綁定和解除
綁定和解除,均需要行為和Component雙方共同參與才行。
實際操作,Behavior分別使用attach()和detach()來實現即可。
定義一個行為定義一個行為,即是準備好注入到現有類的屬性和方法。即要寫一個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。當該類與Component綁定后,Component也就擁有了相對應public的屬性和方法,而private和protected的屬性和方法并不能得到。
行為的綁定有兩種方法可以將一個Behavior綁定到一個yiiaseComponent上。
靜態方法:在代碼沒有跑起來之前靜態綁定,只需要重載yiiaseComponent::bahaviors()就可以了。該方法描述類所具有的行為。描述方法:
配置來描述
Behavior類名
Behavior類的配置數組
namespace appmodels; use yiidbActiveRecord; use appComponentsMyBehavior; class User extends ActiveRecord{ public function behaviors(){ return [ // 匿名行為 MyBehavior::className(), // 名為myBehavior2的行為 "myBehavior2" => MyBehavior::className(), // 匿名行為 + 給出配置數組 [ "class" => MyBehavior::className(), "prop1" => "v1", "prop3" => "v3", ], // 帶名稱的行為 + 配置數組 "myBehavior4" => [ "class" => MyBehavior::className(), "prop1" => "v1", "prop3" => "v3" ] ]; } }
另外通過配置文件:
[ "as myBehavior2" => MyBehavior::className(), ]動態方法綁定行為
需要調用yiiaseComponent::attachBehaviors()
$Component->attachBehaviors([ "myBehavior1" => new MyBehavior, ]);
$behavior = $Component->getBehavior("myBehavior1");綁定的內部原理
yiiaseComponent::behaviors()
yiiaseComponent::ensureBehaviors()
yiiaseComponent::attachBehaviorInternal()
yiiaseBehavior::attach()
關于綁定,做個小結:
綁定的動作從Component發起;
靜態綁定通過重載 yiiaseComponet::behaviors() 實現;
動態綁定通過調用 yiiaseComponent::attachBehaviors() 實現;
行為還可以通過為 Component 配置 as 配置項進行綁定;
行為有匿名行為和命名行為之分,區別在于綁定時是否給出命名。 命名行為可以通過其命名進行標識,從而有針對性地進行解除等操作;
綁定過程中,后綁定的行為會取代已經綁定的同名行為;
綁定的意義有兩點,一是為行為設置 $owner 。二是將行為中擬響應的事件的handler綁定到類中去。
行為響應的事件實例綁定和解除的過程,實際上就是將行為中的事件handler綁定到類中去。行為用的最多的,也是對于Component各種事件的響應。
行為的屬性和方法注入原理__get(), __set(), __call()
行為與繼承和特性(Traits)的區別相比較于使用繼承的方式來擴充類功能,使用行為的方式,一是不必對現有類進行修改,二是PHP不支持多繼承,但是Yii可以綁定多個行為,從而達到類似多繼承的效果。
傾向于使用行為的情況:
行為從本質上講,也是PHP的類,因此一個行為可以繼承自另一個行為,從而實現代碼的復用。而特性只是PHP的一種語法,效果上類似于把特性的代碼導入到了類中從而實現代碼的注入,特性是不支持繼承的。
行為可以動態地綁定、解除,而不必要對類進行修改。但是特性必須在類在使用 use 語句,要解除特性時,則要刪除這個語句。換句話說,需要對類進行修改。
行為還以在在配置階段進行綁定,特性就不行了。
行為可以用于對事件進行反饋,而特性不行。
當出現命名沖突時,行為會自行排除沖突,自動使用先綁定的行為。而特性在發生沖突時,需要人為干預,修改發生沖突的變量名、屬性名、方法名。
傾向于使用特性的情況:
特性比行為在效率上要高一點,因為行為其實是類的實例,需要時間和空間進行分配。
特性是PHP的語法,因此,IDE的支持要好一些。目前還沒有IDE能支持行為。
參考
http://www.digpage.com/behavior.html
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/21435.html
摘要:環境需要了解一下一個純粹的與本地環境密切相關的配置項。對于配置項以數組進行組織。數組元素表示將要創建的對象的完整類名。數組元素表示指定為屬性的初始值為。數組元素表示將綁定到對象的事件中。對于形式配置項,視配置值為一個事件,綁定到上。 環境 需要了解一下cookieValidationKey:一個純粹的、與本地環境密切相關的配置項。 但是,在有些情況下,cookieValidationK...
摘要:成員變量可以視為一個可讀可寫沒有任何預處理或后處理的屬性。而成員變量由于外部不可見,與屬性外的特性不相符,所以不能視為屬性。在一些表示數據結構數據集合等簡單情況下,且不需讀寫控制等,可以考慮使用成員變量作為屬性,這樣可以提高一點效率。 Yii基礎 屬性 property 屬性用于表征類的狀態,從訪問的形式上看,屬性與成員變量沒有區別。但是,成員變量是就類的結構構成而言的概念,而屬性是就...
摘要:事件的綁定和解除對事件進行綁定和解綁。使用全局函數作為來進行綁定使用對象的成員函數來進行綁定使用類的靜態成員函數進行綁定使用匿名函數上面的數組是用來維護事件數組。事件的級別類級別事件類級別事件用于響應所有類實例的事件。 Yii基礎 事件 event 使用事件,可以在特定的時點,觸發執行預先設定的一段代碼,事件既是代碼解耦的一種方式,也是設計業務流程的一種模式。 事件的相關要素 這是一...
摘要:設置別名的目的特殊的變量常量保存整個應用的所有別名。別名的解析過程先按根別名找到可能保存別名的分支。別名必然以打頭。別名解析時,優先匹配較長的別名。使用別名時,要將別名放在最前面,不能放在中間。 Alias 設置別名的目的:特殊的變量常量 yiiBaseYii::$aliases保存整個Yii應用的所有別名。 在yiiaseApplication的構造函數__construct()中...
摘要:實現的類自動加載,依賴于的,注冊一個自己的自動加載函數,并插入到自動加載函數棧的最前面,確保的會被最先調用。首先加載第三方的,再加載的。最后加載的,這樣可以保證的優先加載。 實現 Yii的類自動加載,依賴于PHP的spl_autoload_register(), 注冊一個自己的自動加載函數(autoloader),并插入到自動加載函數棧的最前面,確保Yii的autoloader會被最先...
閱讀 1751·2021-09-28 09:43
閱讀 1111·2021-09-23 11:22
閱讀 2707·2021-09-14 18:05
閱讀 1823·2019-08-30 15:52
閱讀 2812·2019-08-30 10:55
閱讀 2007·2019-08-29 16:58
閱讀 1323·2019-08-29 16:37
閱讀 3031·2019-08-29 16:25