一個綁定了行為的類,表現起來是這樣的:
// Step 1: 定義一個將綁定行為的類 class MyClass extends yii\base\Component { // 空的 } // Step 2: 定義一個行為類,他將綁定到MyClass上 class MyBehavior extends yii\base\Behavior { // 行為的一個屬性 public $property1 = 'This is property in MyBehavior.'; // 行為的一個方法 public function method1() { return 'Method in MyBehavior is called.'; } } $myClass = new MyClass(); $myBehavior = new MyBehavior(); // Step 3: 將行為綁定到類上 $myClass->attachBehavior('myBehavior', $myBehavior); // Step 4: 訪問行為中的屬性和方法,就和訪問類自身的屬性和方法一樣 echo $myClass->property1; echo $myClass->method1();
上面的代碼你不用全都看懂,雖然你可能已經用腳趾頭猜到了這些代碼的意思, 但這裡你只需要記住行為中的屬性和方法可以被所綁定的類像訪問自身的屬性和方法一樣直接訪問就OK了。 代碼中, $myClass 是沒有 property1 method() 成員的。這倆是 $myBehavior 的成員。 但是,通過 attachBehavior() 將行為綁定到對象之後, $myCalss 就好像練成了吸星大法、化功大法,表現的財大氣粗,將別人的屬性和方法都變成了自己的。
另外,從上面的代碼中,你還要掌握使用行為的大致流程:
使用行為,必須像前文描述的一樣先把它附加到 yii\base\Component 類或其子類。一旦行為附加到組件,就可以直接使用它。
行為附加到組件後,可以通過組件訪問一個行為的公共成員變量或 getter 和 setter 方法定義的屬性:
// "prop1" 是定義在行為類的屬性 echo $component->prop1; $component->prop1 = $value; 類似地也可以調用行為的公共方法: // foo() 是定義在行為類的公共方法 $component->foo();
如你所見,盡管 $component 未定義 prop1 和 foo() ,它們用起來也像組件自己定義的一樣。
如果兩個行為都定義了一樣的屬性或方法,並且它們都附加到同一個組件,那麼首先附加上的行為在屬性或方法被訪問時有優先權。
附加行為到組件時的命名行為,可以使用這個名稱來訪問行為對象,如下所示:
$behavior = $component->getBehavior('myBehavior');
也能獲取附加到這個組件的所有行為:
$behaviors = $component->getBehaviors();
移除行為
要移除行為,可以調用 yii\base\Component::detachBehavior() 方法用行為相關聯的名字實現:
$component->detachBehavior('myBehavior1');
也可以移除全部行為:
$component->detachBehaviors();