Yii 應用創建於組件之上。組件是 CComponent 或其子類的實例。使用組件主要涉及訪問它的屬性以及觸發或處理它的時間。 基類 CComponent 指定了如何定義屬性和事件。數組
組件的屬性就像對象的公共成員變量。它是可讀寫的。例如:yii
$width=$component->textWidth; // 獲取 textWidth 屬性 $component->enableCaching=true; // 設置 enableCaching 屬性
要定義一個組件屬性,咱們只需在組件類中定義一個公共成員變量便可。更靈活的方式是定義其 getter 和 setter 方法,例如:函數
public function getTextWidth() { return $this->_textWidth; } public function setTextWidth($value) { $this->_textWidth=$value; }
上述代碼定義了一個可寫的屬性名爲 textWidth
(名字是大小寫不敏感的)。 當讀取屬性時,getTextWidth()
就會被調用,其返回值則成爲屬性值;類似的, 當寫入屬性時,setTextWidth()
被調用。若是 setter 方法沒有定義,則屬性將是隻讀的, 若是對其寫入則會拋出一個異常。使用 getter 和 setter 方法定義一個屬性有一個好處:即當讀取或寫入屬性時, 能夠執行額外的邏輯(例如,執行驗證,觸發事件)。this
注意: 經過 getter / setter 定義的屬性和類成員變量之間有一個細微的差別。前者的名字是大小寫不敏感的, 然後者是大小寫敏感的。spa
組件事件是一些特殊的屬性,它們使用一些稱做 事件句柄 (event handlers)
的方法做爲其值。 附加(分配)一個方法到一個事件將會引發方法在事件被喚起處自動被調用。所以, 一個組件的行爲可能會被一種在部件開發過程當中不可預見的方式修改。code
組件事件以 on
開頭的命名方式定義。和屬性經過 getter/setter 方法來定義的命名方式同樣, 事件的名稱是大小寫不敏感的。如下代碼定義了一個 onClicked
事件:component
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
訪問此行爲的屬性。