欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2016年05月20日 12:21:56   作者:yanhui_wei  
這篇文章主要介紹了Yii框架組件和事件行為管理,詳細(xì)分析了Yii框架組件管理與行為管理的原理與使用技巧,需要的朋友可以參考下

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

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

組件管理

YII是一個純oop框架,很多類中的成員變量的受保護(hù)或者私有的,CComponent中利用php中的魔術(shù)方法__get(),__set()來訪問和設(shè)置屬性,但這些方法的作用遠(yuǎn)不指這些。下面用__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)));
}

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

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

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

3、如果name存在行為數(shù)組中,返回改行為,如果不存在,執(zhí)行第4步

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

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

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

public function __get($name)
{
  if($this->hasComponent($name))
    return $this->getComponent($name);
  else
    return parent::__get($name);
}

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

事件行為管理

事件相當(dāng)于對一個組件的擴(kuò)展或者插件,以組件中預(yù)留的鉤子實(shí)現(xiàn)組件內(nèi)部調(diào)用外部、外部對組件部分控制。在CComponent子類中可以定義以on開頭的方法為事件,類似于js中的onclick、onchange等,其實(shí)原理差不多。所有事件是與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中調(diào)用run()方法在處理請求之前先判斷外部是否傳人onBeginRequest事件的句柄,如果有則通過onBeginRequest($event)方法調(diào)用CComponent中的raiseEvent()方法執(zhí)行句柄中的函數(shù)或者方法。

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

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

PS:小編在這里推薦一款本站的php格式化美化的排版工具幫助大家在以后的PHP程序設(shè)計中進(jìn)行代碼排版:

php代碼在線格式化美化工具:http://tools.jb51.net/code/phpformat

更多關(guān)于Yii相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Yii框架入門及常用技巧總結(jié)》、《php優(yōu)秀開發(fā)框架總結(jié)》、《smarty模板入門基礎(chǔ)教程》、《php日期與時間用法總結(jié)》、《php面向?qū)ο蟪绦蛟O(shè)計入門教程》、《php字符串(string)用法總結(jié)》、《php+mysql數(shù)據(jù)庫操作入門教程》及《php常見數(shù)據(jù)庫操作技巧匯總

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

相關(guān)文章

  • PHP封裝返回Ajax字符串和JSON數(shù)組的方法

    PHP封裝返回Ajax字符串和JSON數(shù)組的方法

    下面小編就為大家?guī)硪黄狿HP封裝返回Ajax字符串和JSON數(shù)組的方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-02-02
  • Yii框架小部件(Widgets)用法實(shí)例詳解

    Yii框架小部件(Widgets)用法實(shí)例詳解

    這篇文章主要介紹了Yii框架小部件(Widgets)用法,結(jié)合實(shí)例形式詳細(xì)分析了Yii框架小部件(Widgets)基本功能、創(chuàng)建、使用方法及操作注意事項,需要的朋友可以參考下
    2020-05-05
  • php 批量查詢搜狗sogou代碼分享

    php 批量查詢搜狗sogou代碼分享

    本文給大家分享的是使用php實(shí)現(xiàn)批量查詢搜狗的實(shí)例代碼,非常的簡單實(shí)用,有需要的小伙伴可以參考下。
    2015-05-05
  • PHP中的日期加減方法示例

    PHP中的日期加減方法示例

    這篇文章主要介紹了PHP中的日期加減方法示例,主要是對date()函數(shù)和strtotime()函數(shù)使用,需要的朋友可以參考下
    2014-08-08
  • Yii2中關(guān)聯(lián)查詢簡單用法示例

    Yii2中關(guān)聯(lián)查詢簡單用法示例

    這篇文章主要介紹了Yii2中關(guān)聯(lián)查詢簡單用法,涉及Yii2的數(shù)據(jù)庫查詢方法及鏈?zhǔn)讲僮骱唵问褂眉记?需要的朋友可以參考下
    2016-08-08
  • PHP執(zhí)行l(wèi)inux命令常用函數(shù)匯總

    PHP執(zhí)行l(wèi)inux命令常用函數(shù)匯總

    一般情況下,很少會用php去執(zhí)行l(wèi)inux命令,不過特殊情況下,你也許會用到這些函數(shù)。以前我知道有二個函數(shù)可以執(zhí)行l(wèi)inux命令,一個是exec,一個是shell_exec,通過本文給大家介紹PHP執(zhí)行l(wèi)inux命令常用函數(shù)匯總,需要的朋友參考下
    2016-02-02
  • 簡單的php數(shù)據(jù)庫操作類代碼(增,刪,改,查)

    簡單的php數(shù)據(jù)庫操作類代碼(增,刪,改,查)

    這幾天準(zhǔn)備重新學(xué)習(xí),梳理一下知識體系,同時按照功能模塊劃分做一些東西。所以。mysql的操作成為第一個要點(diǎn)。我寫了一個簡單的mysql操作類,實(shí)現(xiàn)數(shù)據(jù)的簡單的增刪改查功能。
    2013-04-04
  • php文件上傳的例子及參數(shù)詳解

    php文件上傳的例子及參數(shù)詳解

    這篇文章主要介紹了php文件上傳的例子及參數(shù),有需要的朋友可以參考一下
    2013-12-12
  • CodeIgniter視圖使用注意事項

    CodeIgniter視圖使用注意事項

    這篇文章主要介紹了CodeIgniter視圖使用注意事項,分析說明了CodeIgniter視圖的加載、定義及模板與函數(shù)的使用方法,需要的朋友可以參考下
    2016-01-01
  • 簡單的自定義php模板引擎

    簡單的自定義php模板引擎

    這篇文章主要為大家詳細(xì)介紹了簡單的自定義php模板引擎,模板引擎的原理是什么,感興趣的小伙伴們可以參考一下
    2016-08-08

最新評論