Yii 應用建立於組件之上。元件是 CComponent 或其子類別的實例。使用組件主要涉及存取它的屬性以及觸發或處理它的時間。 基類 CComponent 指定如何定義屬性和事件。
組件的屬性就像物件的公共成員變數。它是可讀寫的。例如:
$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 方法定義一個屬性有一個好處:即當讀取或寫入屬性時, 可以執行額外的邏輯(例如,執行驗證,觸發事件)。
注意: 透過 getter / setter 定義的屬性和類別成員變數之間有一個細微的差異。前者的名字是大小寫不敏感的, 而後者是大小寫敏感的。
元件事件是一些特殊的屬性,它們使用一些稱作 事件句柄 (event handlers)
的方法作為其值。 附加(分配)一個方法到一個事件將會引起方法在事件被喚起處自動被呼叫。因此, 一個組件的行為可能會被一種在部件開發過程中不可預見的方式修改。
元件事件以 on
開頭的命名方式定義。和屬性透過 getter/setter 方法來定義的命名方式一樣, 事件的名稱是大小寫不敏感的。以下程式定義了一個 onClicked
事件:
public function onClicked($event) { $this->raiseEvent('onClicked', $event); }
這裡作為事件參數的 $event
我們可以附加一個方法到此 event,如下所示:
$component->onClicked=$callback;
這裡的 $callback
指向了一個有效的 PHP 回調。它可以是一個全域函數也可以是類別中的一個方法。 如果是後者,它必須以一個陣列的方式提供: array($object,'methodName')
.
事件句柄的結構如下:
function methodName($event) { ...... }
<pre class="brush:php;toolbar:false">$component->onClicked=function($event) {
......
}</pre>
即描述事件的參數(它來自 raiseEvent()
調用)。
參數是 CEvent 或其子類別的實例。 至少,它包含了關於誰觸發了此事件的資訊。
從版本 1.0.10 開始,事件句柄也可以是一個PHP 5.3以後支援的匿名函數。例如,
// $name 在组件中实现了对行为的唯一识别 $component->attachBehavior($name,$behavior); // test() 是行为中的方法。 $component->test();
如果我們現在調用
onClicked()
,onClicked
號事件將被觸發(在頁)中被觸發事件中的事件。
一個事件可以綁定多個句柄。當事件觸發時, 這些句柄將會被依照它們綁定到事件時的順序依序執行。如果句柄決定組織後續句柄被執行,它可以設定 $event->handled 為 true。
從版本 1.0.2 開始,元件已新增了對 mixin 的支持,並且可以綁定一個或多個行為。 行為 是一個對象,其方法可以被它綁定的部件通過收集功能的方式來實現 繼承(inherited)
,而不是專有化繼承(即普通的類繼承).一個部件可以以'多重繼承'的方式實作多個行為的綁定.
行為類別必須實作 IBehavior 介面。 大多數行為可以繼承自 CBehavior 。如果一個行為需要綁定到一個 模型, 它也可以從專為模型實現綁定特性的 CModelBehavior 或 CActiveRecordBehavior 繼承。
要使用一個行為,它必須先透過呼叫此行為的 attach() 方法來綁定到一個元件。然後我們就可以透過元件呼叫此行為方法:
$behavior=$component->tree; // 等于下行代码: // $behavior=$component->asa('tree');
已綁定的行為可以像一個元件中的普通屬性一樣存取。 例如,如果一個名為 tree
的行為綁定到了一個元件,我們就可以透過以下程式碼來獲得指向此行為的引用。
$component->disableBehavior($name); // 下面的代码将抛出一个异常 $component->test(); $component->enableBehavior($name); // 现在就可以使用了 $component->test();
行為是可以被臨時禁止的,此時它的方法開就會在組件中失效.例如:
$component->disableBehavior($name); // 下面的代码将抛出一个异常 $component->test(); $component->enableBehavior($name); // 现在就可以使用了 $component->test();
两个同名行为绑定到同一个组件下是有可能的。在这种情况下,先绑定的行为则拥有优先权。
当和 events, 一起使用时,行为会更加强大。当行为被绑定到组件时,行为里的一些方法就可以绑定到组件的一些事件上了. 这样一来,行为就可以观察或者改变组件的常规执行流程。
自版本 1.1.0 开始,一个行为的属性也可以通过绑定到的组件来访问。 这些属性包含公共成员变量以及通过 getters 和/或 setters 方式设置的属性。 例如, 若一个行为有一个 xyz 的属性,此行为被绑定到组件 $a,然后我们可以使用表达式 $a->xyz
访问此行为的属性。
以上就是Yii框架官方指南系列10——基础知识:组件的内容,更多相关内容请关注PHP中文网(www.php.cn)!