Yii框架核心組件類實例詳解

這篇文章主要介紹了Yii框架核心組件類,結合實例形式詳細分析了Yii框架中成員變量擴展、事件模型及行爲類綁定相關原理與操作技巧,需要的朋友可以參考下

本文實例講述了Yii框架核心組件類。分享給大家供大家參考,具體如下:

CComponent類爲YII框架的基於組件和事件驅動編程提供了基礎,YII框架中的大部分類都將CComponent類作爲基類。

CComponent類爲它的子類提供3個特性:

1、成員變量擴展

通過定義兩個成員函數(getXXX/setXXX)來定義一個成員變量,比如:

public function getText() {…}
public function setText {…}

這樣就相當於定義了一個$text成員變量,可以這樣調用

$a=new CComponent;
$a=$component->text; // 等價於$a=$component->getText();
$component->text='abc'; // 等價於$component->setText(‘abc');

CComponent是通過魔術方法__get和__set來實現“成員變量擴展”特性的,如果對類本身不存在的成員變量進行操作時,php會調用這個類 的__get和__set方法來進行處理。CComponent利用這兩個魔術方法實現了“成員變量擴展”特性。下圖描述了一個CComponent的子 類,它增加了active和sessionName兩個成員變量,該圖描述了對於這兩個成員變量的調用流程。

Posted Image

面向對象編程中直接定義一個成員變量就可以了,爲什麼CComponent要通過定義2個函數來實現一個成員變量呢?一個主要得原因是需要對成員變 量進行“延時加載”,一般情況下類的成員變量是在構造函數或者初始化函數進行統一賦值,但是在一次web請求的處理過程中不是每個成員變量都會被使用,比 如App類中定義了兩個成員變量:$cache和$db($cache是一個緩存對象,$db是一個數據庫鏈接對象),這兩個對象在App類初始化的時候 創建,但是一個web網站的有些頁面,它內容可以通過緩存獲取,那麼數據庫鏈接對象其實就不需要創建。如果將App定義爲CComponent的子類,在 App類中定義兩個方法:getCache/getDb,這樣就可以做到第一次使用db成員變量的時候,才調用getDb函數來進行數據庫鏈接的初始化, 從而實現延時加載——即在第一次使用時進行初始化。雖然延時加載會增加一次函數調用,但是可以減少不必要的成員變量的初始化(總體上其實是提升了網站的訪 問速度),而且可以使得我們的代碼更加易維護、易擴展。

延時加載應該是“成員變量擴展”特性的最重要的用途,當然這個特性還會有其它用途,想一想,當你操作一個成員變量的時候,你其實是在調用getXXX和setXXX成員函數,你是在調用一段代碼!

2、事件模型

事件模型就是設計模式中的“觀察者模式”:當對象的狀態發生了變化,那麼這個對象可以將該事件通知其它對象。

爲了使用事件模型,需要實現這三個步驟:1、定義事件;2、註冊事件句柄;3、觸發事件。
CComponent的子類通過定義一個以on打頭的成員函數來定義一個事件,比如:public function onClick(){…},接着通過調用attachEventHandler成員函數來註冊事件句柄(可以註冊多個事件句柄),最後通過調用 raiseEvent來觸發事件。

CComponent類使用一個私有的成員變量來保存事件以及處理該事件的所有句柄,該成員變量可以看作一個hash表,hash表的key是事件的名稱,hash表的value是事件處理函數鏈表。

Posted Image

3、行爲類綁定

有兩種辦法可以對類添加特性:1、直接修改這個類的代碼,添加一些成員函數和成員變量;2、派生,通過子類來擴展。很明顯第二種方法更加易維護、易擴展。如果需要對一個類添加多個特性(多人在不同時期),那麼需要進行多級派生,這顯然加大了維護成本。

CComponent使用一種特殊的方式對類信息擴展——行爲類綁定。行爲類是一個CBehavior的子類,CComponent可以將一個或者多個 CBehavior類的成員函數和成員變量添加到自己身上,並且在不需要的時候卸載掉某些CBehavior類。下面是一個簡單的例子:

//計算器類
class Calculator extends CBehavior
{
public function add($x, $y) { return $x + $y; }
public function sub($x, $y) { return $x – $y; }
…
}
$comp = new CComponent();
//爲我的類添加計算器功能
$comp->attachbehavior(‘calculator', new Calculator());
$comp->add(2, 5);
$comp->sub(2, 5);

CComponent通過__get、__set和__call這3個魔術方法來實現“行爲類綁定”這個特性,當調用CComponent類不存在的成員 變量和成員方法的時候,CComponent類會通過這三個魔法方法在“動態綁定的行爲對象”上進行查找。即將不存在的成員變量和成員方法路由到“動態綁 定對象”上。

Posted Image

可以用3句話來總結CComponent類的特性:

1、 更好的配置一個對象,當設置對象的成員變量的時候,其實是運行一段代碼;
2、 更好的監聽一個對象,當對象的內部狀態發生變化的時候,其它對象可以得到通知;
3、 更好的擴展一個對象,可以給一個對象增加成員變量和成員函數,還能監聽這個對象的狀態。

更多關於Yii相關內容感興趣的讀者可查看本站專題:《Yii框架入門及常用技巧總結》、《php優秀開發框架總結》、《smarty模板入門基礎教程》、《php面向對象程序設計入門教程》、《php字符串(string)用法總結》、《php+mysql數據庫操作入門教程》及《php常見數據庫操作技巧彙總

希望本文所述對大家基於Yii框架的PHP程序設計有所幫助。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章