本文實(shí)例講述了Yii框架核心組件類。分享給大家供大家參考,具體如下:
CComponent類為YII框架的基于組件和事件驅(qū)動(dòng)編程提供了基礎(chǔ),YII框架中的大部分類都將CComponent類作為基類。
CComponent類為它的子類提供3個(gè)特性:
1、成員變量擴(kuò)展
通過定義兩個(gè)成員函數(shù)(getXXX/setXXX)來定義一個(gè)成員變量,比如:
public function getText() {…}
public function setText {…}
這樣就相當(dāng)于定義了一個(gè)$text成員變量,可以這樣調(diào)用
$a=new CComponent;
$a=$component->text; // 等價(jià)于$a=$component->getText();
$component->text='abc'; // 等價(jià)于$component->setText(‘a(chǎn)bc');
CComponent是通過魔術(shù)方法__get和__set來實(shí)現(xiàn)“成員變量擴(kuò)展”特性的,如果對(duì)類本身不存在的成員變量進(jìn)行操作時(shí),php會(huì)調(diào)用這個(gè)類 的__get和__set方法來進(jìn)行處理。CComponent利用這兩個(gè)魔術(shù)方法實(shí)現(xiàn)了“成員變量擴(kuò)展”特性。下圖描述了一個(gè)CComponent的子 類,它增加了active和sessionName兩個(gè)成員變量,該圖描述了對(duì)于這兩個(gè)成員變量的調(diào)用流程。
![](/d/20211017/028537f2dad81f50394715d3e639c857.gif)
面向?qū)ο缶幊讨兄苯佣x一個(gè)成員變量就可以了,為什么CComponent要通過定義2個(gè)函數(shù)來實(shí)現(xiàn)一個(gè)成員變量呢?一個(gè)主要得原因是需要對(duì)成員變 量進(jìn)行“延時(shí)加載”,一般情況下類的成員變量是在構(gòu)造函數(shù)或者初始化函數(shù)進(jìn)行統(tǒng)一賦值,但是在一次web請(qǐng)求的處理過程中不是每個(gè)成員變量都會(huì)被使用,比 如App類中定義了兩個(gè)成員變量:$cache和$db($cache是一個(gè)緩存對(duì)象,$db是一個(gè)數(shù)據(jù)庫鏈接對(duì)象),這兩個(gè)對(duì)象在App類初始化的時(shí)候 創(chuàng)建,但是一個(gè)web網(wǎng)站的有些頁面,它內(nèi)容可以通過緩存獲取,那么數(shù)據(jù)庫鏈接對(duì)象其實(shí)就不需要?jiǎng)?chuàng)建。如果將App定義為CComponent的子類,在 App類中定義兩個(gè)方法:getCache/getDb,這樣就可以做到第一次使用db成員變量的時(shí)候,才調(diào)用getDb函數(shù)來進(jìn)行數(shù)據(jù)庫鏈接的初始化, 從而實(shí)現(xiàn)延時(shí)加載——即在第一次使用時(shí)進(jìn)行初始化。雖然延時(shí)加載會(huì)增加一次函數(shù)調(diào)用,但是可以減少不必要的成員變量的初始化(總體上其實(shí)是提升了網(wǎng)站的訪 問速度),而且可以使得我們的代碼更加易維護(hù)、易擴(kuò)展。
延時(shí)加載應(yīng)該是“成員變量擴(kuò)展”特性的最重要的用途,當(dāng)然這個(gè)特性還會(huì)有其它用途,想一想,當(dāng)你操作一個(gè)成員變量的時(shí)候,你其實(shí)是在調(diào)用getXXX和setXXX成員函數(shù),你是在調(diào)用一段代碼!
2、事件模型
事件模型就是設(shè)計(jì)模式中的“觀察者模式”:當(dāng)對(duì)象的狀態(tài)發(fā)生了變化,那么這個(gè)對(duì)象可以將該事件通知其它對(duì)象。
為了使用事件模型,需要實(shí)現(xiàn)這三個(gè)步驟:1、定義事件;2、注冊(cè)事件句柄;3、觸發(fā)事件。
CComponent的子類通過定義一個(gè)以on打頭的成員函數(shù)來定義一個(gè)事件,比如:public function onClick(){…},接著通過調(diào)用attachEventHandler成員函數(shù)來注冊(cè)事件句柄(可以注冊(cè)多個(gè)事件句柄),最后通過調(diào)用 raiseEvent來觸發(fā)事件。
CComponent類使用一個(gè)私有的成員變量來保存事件以及處理該事件的所有句柄,該成員變量可以看作一個(gè)hash表,hash表的key是事件的名稱,hash表的value是事件處理函數(shù)鏈表。
![](/d/20211017/4e77a57ee2bb07f90c312e1c101b81f4.gif)
3、行為類綁定
有兩種辦法可以對(duì)類添加特性:1、直接修改這個(gè)類的代碼,添加一些成員函數(shù)和成員變量;2、派生,通過子類來擴(kuò)展。很明顯第二種方法更加易維護(hù)、易擴(kuò)展。如果需要對(duì)一個(gè)類添加多個(gè)特性(多人在不同時(shí)期),那么需要進(jìn)行多級(jí)派生,這顯然加大了維護(hù)成本。
CComponent使用一種特殊的方式對(duì)類信息擴(kuò)展——行為類綁定。行為類是一個(gè)CBehavior的子類,CComponent可以將一個(gè)或者多個(gè) CBehavior類的成員函數(shù)和成員變量添加到自己身上,并且在不需要的時(shí)候卸載掉某些CBehavior類。下面是一個(gè)簡(jiǎn)單的例子:
//計(jì)算器類
class Calculator extends CBehavior
{
public function add($x, $y) { return $x + $y; }
public function sub($x, $y) { return $x – $y; }
…
}
$comp = new CComponent();
//為我的類添加計(jì)算器功能
$comp->attachbehavior(‘calculator', new Calculator());
$comp->add(2, 5);
$comp->sub(2, 5);
CComponent通過__get、__set和__call這3個(gè)魔術(shù)方法來實(shí)現(xiàn)“行為類綁定”這個(gè)特性,當(dāng)調(diào)用CComponent類不存在的成員 變量和成員方法的時(shí)候,CComponent類會(huì)通過這三個(gè)魔法方法在“動(dòng)態(tài)綁定的行為對(duì)象”上進(jìn)行查找。即將不存在的成員變量和成員方法路由到“動(dòng)態(tài)綁 定對(duì)象”上。
![](/d/20211017/038f5a26d5dfb1b6a2cd31c334cfc70b.gif)
可以用3句話來總結(jié)CComponent類的特性:
1、 更好的配置一個(gè)對(duì)象,當(dāng)設(shè)置對(duì)象的成員變量的時(shí)候,其實(shí)是運(yùn)行一段代碼;
2、 更好的監(jiān)聽一個(gè)對(duì)象,當(dāng)對(duì)象的內(nèi)部狀態(tài)發(fā)生變化的時(shí)候,其它對(duì)象可以得到通知;
3、 更好的擴(kuò)展一個(gè)對(duì)象,可以給一個(gè)對(duì)象增加成員變量和成員函數(shù),還能監(jiān)聽這個(gè)對(duì)象的狀態(tài)。
更多關(guān)于Yii相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Yii框架入門及常用技巧總結(jié)》、《php優(yōu)秀開發(fā)框架總結(jié)》、《smarty模板入門基礎(chǔ)教程》、《php面向?qū)ο蟪绦蛟O(shè)計(jì)入門教程》、《php字符串(string)用法總結(jié)》、《php+mysql數(shù)據(jù)庫操作入門教程》及《php常見數(shù)據(jù)庫操作技巧匯總》
希望本文所述對(duì)大家基于Yii框架的PHP程序設(shè)計(jì)有所幫助。
您可能感興趣的文章:- Yii框架學(xué)習(xí)筆記之應(yīng)用組件操作示例
- yii2高級(jí)應(yīng)用之自定義組件實(shí)現(xiàn)全局使用圖片上傳功能的方法
- Yii框架組件和事件行為管理詳解
- Yii擴(kuò)展組件編寫方法實(shí)例分析
- yii2行為的方法如何注入到組件類中詳解
- Yii框架響應(yīng)組件用法實(shí)例分析
- PHP的Yii框架中移除組件所綁定的行為的方法
- Yii框架自定義數(shù)據(jù)庫操作組件示例
- Yii2中組件的注冊(cè)與創(chuàng)建方法
- Yii框架組件的事件機(jī)制原理與用法分析
- Yii框架應(yīng)用組件用法實(shí)例分析