日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > php >内容正文

php

php事件和行为,Yii框架组件和事件行为管理详解

發布時間:2025/4/5 php 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 php事件和行为,Yii框架组件和事件行为管理详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Yii框架組件和事件行為管理詳解

來源:中文源碼網????瀏覽: 次????日期:2018年9月2日

【下載文檔:??Yii框架組件和事件行為管理詳解.txt?】

(友情提示:右鍵點上行txt文檔名->目標另存為)

Yii框架組件和事件行為管理詳解 本文實例講述了Yii框架組件和事件行為管理。分享給大家供大家參考,具體如下:

Yii是一個基于組件、用于開發大型 Web 應用的高性能 PHP 框架。CComponent幾乎是所有類的基類,它控制著組件與事件的管理,其方法與屬性如下,私有變量$_e數據存放事件(evnet,有些地方叫hook),$_m數組存放行為(behavior)。組件管理

YII是一個純oop框架,很多類中的成員變量的受保護或者私有的,CComponent中利用php中的魔術方法__get(),__set()來訪問和設置屬性,但這些方法的作用遠不指這些。下面用__get()來說明

public function __get($name)

{

$getter='get'.$name;

if(method_exists($this,$getter))

return $this->$getter();

else if(strncasecmp($name,'on',2)===0 && method_exists($this,$name))

{

// duplicating getEventHandlers() here for performance

$name=strtolower($name);

if(!isset($this->_e[$name]))

$this->_e[$name]=new CList;

return $this->_e[$name];

}

else if(isset($this->_m[$name]))

return $this->_m[$name];

else if(is_array($this->_m))

{

foreach($this->_m as $object)

{

if($object->getEnabled() && (property_exists($object,$name) || $object->canGetProperty($name)))

return $object->$name;

}

}

throw new CException(Yii::t('yii','Property "{class}.{property}" is not defined.',

array('{class}'=>get_class($this), '{property}'=>$name)));

}當CComponent或者其子類對象實例$obj->name的時候,__get($name)方法:

1、首先判斷實例中是否有getName()方法,如果有則返回 ,如果沒有執行第2步

2、判斷是否是以on開頭的,以on開頭的一般都是CComponent子類中預留的事件,用與掛在事件,通過method_exists($this,$name)判斷該name是否存在類的實例中,如果存在,返回事件,否則執行第3步

3、如果name存在行為數組中,返回改行為,如果不存在,執行第4步

4、遍歷行為數組,數組中行為是CBehavior子類的實例,而CBehavior又是CComponent中子類,所以用遞歸的方法獲取行為中的方法,如果沒有,執行第5步

5、拋出異常:請求的屬性不存在。

在CComponent子類中可以重載__get()方法,如在CModule中加入了獲取組件的判斷。這就注意一個問題了屬性和組件名最好不要重名,因為程序會優先加載組件,可能得到的不是我們想要的屬性,如果必須重名的話,就要用getter獲取屬性。

public function __get($name)

{

if($this->hasComponent($name))

return $this->getComponent($name);

else

return parent::__get($name);

}關于組件的加載與創建,上篇YII框架分析筆記1:YII執行流程中的第3點中有個疑問:注冊框架核心組件的時候一下子加載這么多,是不是影響性能呢?其實沒有,注冊的時候只是把組件和其對應的配置用鍵值對的形式保存在數組中(預加載的除外),當用到時候才像上面那樣去創建組件,會通過YIIBase中的createComponent()方法創建,并初始化。通過CModule或其子孫類(如CWebApplication)調用__get()或getComponent()獲取組件時,CModule通過$_components數組建立對象池,確保每個組件在一次請求中只實例化一次。

事件行為管理

事件相當于對一個組件的擴展或者插件,以組件中預留的鉤子實現組件內部調用外部、外部對組件部分控制。在CComponent子類中可以定義以on開頭的方法為事件,類似于js中的onclick、onchange等,其實原理差不多。所有事件是與CComponent在同一文件中CEvent的子類。

/**

* Raised right BEFORE the application processes the request.

* @param CEvent $event the event parameter

*/

public function onBeginRequest($event)

{

$this->raiseEvent('onBeginRequest',$event);

}

/**

* Runs the application.

* This method loads static application components. Derived classes usually overrides this

* method to do more application-specific tasks.

* Remember to call the parent implementation so that static application components are loaded.

*/

public function run()

{

if($this->hasEventHandler('onBeginRequest'))

$this->onBeginRequest(new CEvent($this));

$this->processRequest();

if($this->hasEventHandler('onEndRequest'))

$this->onEndRequest(new CEvent($this));

}比如在CApplication中調用run()方法在處理請求之前先判斷外部是否傳人onBeginRequest事件的句柄,如果有則通過onBeginRequest($event)方法調用CComponent中的raiseEvent()方法執行句柄中的函數或者方法。

行為是事件的升級版,所有的行為都是CBehavior的子類。分析上面的__get()方法分析第4步可以看出來行為的作用是完全擴展組件的特性,可以是屬性、方法、事件甚至行為,這樣使程序開發更加靈活。

行為的另一個作用是將相似事件句柄放在一起,在行為執行attach()方法的時候會將events()方法中返回的事件句柄綁定,這樣做達到方面管理和擴展的目的。比如CModelBehavior中將model相關的事件集中起來,便于其子類的復用,當我們需求為model添加行為的時候可以繼承它。

PS:小編在這里推薦一款本站的php格式化美化的排版工具幫助大家在以后的PHP程序設計中進行代碼排版:php代碼在線格式化美化工具:http://tools.zwyuanma.com/code/phpformat

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

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

親,試試微信掃碼分享本頁!?*^_^*

總結

以上是生活随笔為你收集整理的php事件和行为,Yii框架组件和事件行为管理详解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。