在Hangman中定義的GameController使用到一些屬性word,可以使用$this->word 的格式來讀寫這個屬性,但實際上在GameController對應到這個屬性的方法為
/** * @return string the word to be guessed. This value is persistent * during the whole game session. */ public function getWord() { return $this->getPageState('word'); } /** * @param string the word to be guessed. This value is persistent * during the whole game session. */ public function setWord($value) { $this->setPageState('word',$value); }
也就是透過定義getWord, setWord的方式定義一個支援讀寫操作的屬性word(名字是大小寫不敏感的).當讀取屬性時,getWord() 就會被調用,其返回值則成為屬性值;相似的, 當寫入屬性時,setWord() 被呼叫。如果 setter 方法沒有定義 ,則屬性將是唯讀的, 如果對其寫入則會拋出一個異常。使用 getter 和 setter 方法定義一個屬性有一個好處:即當讀取或 寫入屬性時, 可以執行額外的邏輯(例如,執行驗證,觸發事件)。
基類 CComponent 除了可以定義屬性外,還支援觸 發事件,和ASP.Net中UI元件非常類似。
元件事件是一些特殊的屬性,它們使用一些稱作事件句柄 (event handlers) 的方法作為其值。 附加(分配)一個方法到一個事件將會引起方法在事件被喚起處自動被呼叫。因此, 一個組件的行為可能會被 一種在部件開發過程中不可預見的方式修改。
元件事件以 on 開頭的命名方式定義。和屬性透過 getter/setter 方法來 定義的命名方式一樣, 事件的名稱是大小寫不敏感的。以下程式碼定義了一個 onClicked 事件:
public function onClicked($event){$this->raiseEvent('onClicked', $event);}
這裡作為事件參數的 $event 是 CEvent 或其子類別的實例。
我們可以附加一個方法到此 event,如下所示:
$component->onClicked=$callback;
這裡的 $callback 指向了一個有效的 PHP 回呼。它可以是一個全域函數也可以是類別中的一個方法。 如果是後者,它必須以一個陣列的方式提供: array($object,'methodName').
事件句柄的結構如下:
function methodName($event) { ...... }
這裡的$event 即描述事件的參數(它來自raiseEvent () 調用)。 $event 參數是 CEvent 或其子類別的實例。 至 少,它包含了關於誰觸發了此事件的資訊。
從版本 1.0.10 開始,事件句柄也可以是一個PHP 5.3以後支援的匿名函數。 例如,
$component->onClicked=function($event) { ...... }
如果我們現在調用 onClicked(),onClicked 事件將被觸發(在 onClicked() 中), 附屬的事件句柄將被自動調用 。
一個事件可以綁定多個句柄。當事件觸發時, 這些句柄將會被依照它們綁定到事件時的順序依序執行。如果句柄決定群組 織後續句柄被執行,它可以設定 $event->handled 為 true。
從版本 1.0.2 開始,組件已添加了對 mixin 的支持, 並可以綁定一個或多個行為。 行為是一個對象,其方法可以被它綁定的部件通過收集功能的方式來實現繼承(inherited), 而不是專有化繼承(即普通的類繼承).一個部件可以以'多重繼承'的方式實作多個行為的綁定.
行為類別必須實作IBehavior 介面。 大多數行為可以繼承自 CBehavior 。如果一個行為需要綁定到一個 模型, 它也可以從專為模型實現綁定特性的 CModelBehavior 或 CActiveRecordBehavior 繼承。
要使用一個行為,它必須先透過呼叫此行為的 attach() 方法綁定到一個元件。然後我們就可以透過元件呼叫此行為方法:
// $name 在组件中实现了对行为的唯一识别 $component->attachBehavior($name,$behavior);// test() 是行为中的方法。 $component->test();已绑定的行为可以像一个组件中的普通属性一样访问。 例如,如果一个名为 tree 的行为绑定到了一个组件,我们就可以通过如下代码获得指向此行为的引用。 $behavior=$component->tree;// 等于下行代码: // $behavior=$component->asa('tree');行为是可以被临时禁止的,此时它的方法开就会在组件中失效.例如: $component->disableBehavior($name);// 下面的代码将抛出一个异常 $component->test(); $component->enableBehavior($name);// 现在就可以使用了
$component->test();兩個同名行為綁定到同一個元件下是有可能的.在這種情況下,先綁定的行為則擁有優先權。
當和 events, 一起使用時,行為會更加強大。 當行為被綁定到組件時,行為裡的一些方法就可以綁定到組件的一些事件上了.。這樣一來,行為就有機觀察或改變組件的常規執行流程。
自版本 1.1.0 開始,一個行為的屬性也可以透過綁定到的元件來存取。 這些屬性包含公共成員變數以及透過 getters 和/或 setters 方式設定的屬性。 例如, 如果一個行為有一個 xyz 的屬性,此行為被綁定到元件 $a,然後我們可以使用表達式 $a->xyz 存取此行為的屬性。
以上就是PHP開發框架Yii Framework教學(6) CComponent元件的內容,更多相關內容請關注PHP中文網(www.php.cn)!