mirror of
https://github.com/yiisoft/yii.git
synced 2026-03-06 16:16:53 +01:00
156 lines
5.8 KiB
Plaintext
156 lines
5.8 KiB
Plaintext
元件
|
||
=========
|
||
|
||
Yii 應用程式建立於元件之上。元件是 [CComponent] 或其子類別的實體。使用元件主要涉及訪問它的屬性以及觸發或處理它的時間。
|
||
基礎類別 [CComponent] 指定了如何定義屬性和事件。
|
||
|
||
元件屬性
|
||
------------------
|
||
|
||
元件的屬性就像物件的公共成員變數。它是可讀寫的。例如:
|
||
|
||
~~~
|
||
[php]
|
||
$width=$component->textWidth; // 獲取 textWidth 屬性
|
||
$component->enableCaching=true; // 設置 enableCaching 屬性
|
||
~~~
|
||
|
||
要定義一個元件屬性,我們只需在元件類別中定義一個公共成員變數即可。更靈活的方式是定義其 getter 和 setter 方法,例如:
|
||
|
||
~~~
|
||
[php]
|
||
public function getTextWidth()
|
||
{
|
||
return $this->_textWidth;
|
||
}
|
||
|
||
public function setTextWidth($value)
|
||
{
|
||
$this->_textWidth=$value;
|
||
}
|
||
~~~
|
||
|
||
上述程式碼定義了一個可寫的屬性名為 `textWidth` (不區分大小寫)。
|
||
當讀取屬性時,`getTextWidth()` 就會被調用,其返回值則成為屬性值;相似的,
|
||
當寫入屬性時,`setTextWidth()` 被調用。如果 setter 方法沒有定義,則屬性將是只讀的,
|
||
如果對其寫入則會拋出一個異常。使用 getter 和 setter 方法定義一個屬性有一個好處:即當讀取或寫入屬性時,
|
||
可以執行額外的邏輯(例如,執行驗證,觸發事件)。
|
||
|
||
>Note|注意: 通過 getter / setter 定義的屬性和類別成員變數之間有一個細微的差異。前者的名字是大小寫不敏感的,
|
||
而後者是有大小寫敏感。
|
||
|
||
元件事件
|
||
---------------
|
||
|
||
元件事件是一些特殊的屬性,它們使用一些稱作 `事件處理 (event handlers)` 的方法作為其值。
|
||
附加(分配)一個方法到一個事件將會引起方法在事件被喚起處自動被調用。因此,
|
||
一個元件的行為可能會在元件開發過程中被不可預見的方式修改。
|
||
|
||
元件事件以 `on` 開頭的命名方式定義。和屬性通過 getter/setter 方法來定義的命名方式一樣,
|
||
事件的名稱是大小寫不敏感的。以下程式碼定義了一個 `onClicked` 事件:
|
||
|
||
~~~
|
||
[php]
|
||
public function onClicked($event)
|
||
{
|
||
$this->raiseEvent('onClicked', $event);
|
||
}
|
||
~~~
|
||
|
||
這裡作為事件參數的 `$event` 是 [CEvent] 或其子類別的實體。
|
||
|
||
我們可以附加一個方法到此 event,如下所示:
|
||
|
||
~~~
|
||
[php]
|
||
$component->onClicked=$callback;
|
||
~~~
|
||
|
||
這裡的 `$callback` 指向了一個有效的 PHP 回調。它可以是一個全域函數也可以是類別中的一個方法。
|
||
如果是後者,它必須以一個數組的方式提供: `array($object,'methodName')`。
|
||
|
||
事件處理程序的結構如下:
|
||
|
||
~~~
|
||
[php]
|
||
function methodName($event)
|
||
{
|
||
......
|
||
}
|
||
~~~
|
||
|
||
這裡的 `$event` 即描述事件的參數(它來源於 `raiseEvent()` 調用)。`$event` 參數是 [CEvent] 或其子類別的實體。
|
||
至少,它包含了關於誰觸發了此事件的訊息。
|
||
|
||
從版本 1.0.10 開始,事件處理程序也可以是一個 PHP 5.3 以後所支援的匿名函數。例如,
|
||
|
||
~~~
|
||
[php]
|
||
$component->onClicked=function($event) {
|
||
......
|
||
}
|
||
~~~
|
||
|
||
如果我們現在調用 `onClicked()`,`onClicked` 事件將被觸發(在 `onClicked()` 中),
|
||
附屬的事件處理程序將被自動調用。
|
||
|
||
一個事件可以綁定多個處理程序。當事件觸發時,
|
||
這些處理程序將被按照它們綁定到事件時的順序依次執行。如果處理程序決定後續處理程序不被執行,它可以設置
|
||
[$event->handled|CEvent::handled] 為 true。
|
||
|
||
|
||
元件行為
|
||
------------------
|
||
|
||
從版本 1.0.2 開始,元件已增加了對 [mixin](http://en.wikipedia.org/wiki/Mixin) 的支援,並可以綁定一個或多個行為。
|
||
*行為* 是一個物件,其方法可以被它綁定的部件通過收集功能的方式來實現 `繼承(inherited)`,
|
||
而不是特定繼承(即普通的類別繼承)。一個元件可以以'多重繼承'的方式實現多個行為的綁定。
|
||
|
||
行為類別必須實現 [IBehavior] 介面。 大多數行為可以繼承自 [CBehavior] 。如果一個行為需要綁定到一個 [模型](/doc/guide/basics.model),
|
||
它也可以從專為模型實現綁定特性的 [CModelBehavior] 或
|
||
[CActiveRecordBehavior] 繼承。
|
||
|
||
要使用一個行為,它必須首先通過調用此行為的
|
||
[attach()|IBehavior::attach] 方法綁定到一個元件。然後我們就可以通過元件調用此行為方法:
|
||
|
||
~~~
|
||
[php]
|
||
// $name 在元件中實現了對行為的唯一識別
|
||
$component->attachBehavior($name,$behavior);
|
||
// test() 是行為中的方法。
|
||
$component->test();
|
||
~~~
|
||
|
||
已綁定的行為可以像一個元件中的普通屬性一樣存取。
|
||
例如:如果一個名為 `tree` 的行為綁定到了一個元件,我們就可以通過如下程式碼獲得指向此行為的引用。
|
||
|
||
~~~
|
||
[php]
|
||
$behavior=$component->tree;
|
||
// 等於下行程式碼:
|
||
// $behavior=$component->asa('tree');
|
||
~~~
|
||
|
||
行為是可以被臨時禁止的,此時它的方法開就會在元件中失效。例如:
|
||
|
||
~~~
|
||
[php]
|
||
$component->disableBehavior($name);
|
||
// 下面的程式碼將拋出一個異常
|
||
$component->test();
|
||
$component->enableBehavior($name);
|
||
// 現在就可以使用了
|
||
$component->test();
|
||
~~~
|
||
|
||
兩個同名行為綁定到同一個元件下是有可能的。在這種情況下,先綁定的行為則擁有優先權。
|
||
|
||
當和 [events](/doc/guide/basics.component#component-event),一起使用時,行為會更加強大。
|
||
當行為被綁定到元件時,行為裡的一些方法就可以綁定到元件的一些事件上了。
|
||
這樣一來,行為就有機會觀察或者改變元件的常規執行流程。
|
||
|
||
自版本 1.1.0 開始,一個行為的屬性也可以通過綁定到的元件來訪問。
|
||
這些屬性包含公共成員變數以及通過 getters 和/或 setters 方式設置的屬性。
|
||
例如:若一個行為有一個 `xyz` 的屬性,此行為被綁定到元件 `$a`,然後我們可以使用表達式 `$a->xyz` 訪問此行為的屬性。
|
||
|
||
<div class="revision">$Id$</div> |