程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> PHP綜合 >> PHP開發框架Yii Framework教程(6) CComponent組件

PHP開發框架Yii Framework教程(6) CComponent組件

編輯:PHP綜合

在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 訪問此行為的屬性。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved