Files
yii/docs/guide/zh_tw/basics.component.txt
2012-12-24 14:28:56 +08:00

156 lines
5.8 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
元件
=========
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>