首頁 後端開發 php教程 對於Yii框架元件和事件行為管理的解析

對於Yii框架元件和事件行為管理的解析

Jun 19, 2018 pm 02:19 PM
yii 元件管理

這篇文章主要介紹了Yii框架元件和事件行為管理,詳細分析了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添加行為的時候可以繼承它。

以上就是本文的全部內容,希望對大家的學習有所幫助,更多相關內容請關注PHP中文網!

相關推薦:

關於yii分頁元件的用法

#關於Yii資料模型中rules類別驗證器的用法

以上是對於Yii框架元件和事件行為管理的解析的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1666
14
CakePHP 教程
1425
52
Laravel 教程
1324
25
PHP教程
1272
29
C# 教程
1251
24
Yii2 vs Phalcon:哪個框架更適合開發顯示卡渲染應用? Yii2 vs Phalcon:哪個框架更適合開發顯示卡渲染應用? Jun 19, 2023 am 08:09 AM

在當前資訊時代,大數據、人工智慧、雲端運算等技術已成為了各大企業關注的熱點。在這些技術中,顯示卡渲染技術作為一種高效能圖形處理技術,受到了越來越多的關注。顯示卡渲染技術廣泛應用於遊戲開發、影視特效、工程建模等領域。而對於開發者來說,選擇一個適合自己專案的框架,是一個非常重要的決策。在目前的語言中,PHP是一種相當有活力的語言,一些優秀的PHP框架如Yii2、Ph

如何使用PHP框架Yii開發一個高可用的雲端備份系統 如何使用PHP框架Yii開發一個高可用的雲端備份系統 Jun 27, 2023 am 09:04 AM

隨著雲端運算技術的不斷發展,資料的備份已經成為了每個企業必須要做的事情。在這樣的背景下,開發一款高可用的雲端備份系統尤其重要。而PHP框架Yii是一款功能強大的框架,可以幫助開發者快速建立高效能的Web應用程式。以下將介紹如何使用Yii框架開發一款高可用的雲端備份系統。設計資料庫模型在Yii框架中,資料庫模型是非常重要的一環。因為資料備份系統需要用到很多的表和關

php如何使用Yii3框架? php如何使用Yii3框架? May 31, 2023 pm 10:42 PM

隨著互聯網的不斷發展,Web應用程式開發的需求也越來越高。對於開發人員而言,開發應用程式需要一個穩定、高效、強大的框架,這樣可以提高開發效率。 Yii是一款領先的高效能PHP框架,它提供了豐富的特性和良好的性能。 Yii3是Yii框架的下一代版本,它在Yii2的基礎上進一步優化了效能和程式碼品質。在這篇文章中,我們將介紹如何使用Yii3框架來開發PHP應用程式。

Yii框架中的資料查詢:有效率地存取數據 Yii框架中的資料查詢:有效率地存取數據 Jun 21, 2023 am 11:22 AM

Yii框架是一個開源的PHPWeb應用程式框架,提供了眾多的工具和元件,簡化了Web應用程式開發的流程,其中資料查詢是其中一個重要的元件之一。在Yii框架中,我們可以使用類似SQL的語法來存取資料庫,從而有效率地查詢和操作資料。 Yii框架的查詢建構器主要包括以下幾種類型:ActiveRecord查詢、QueryBuilder查詢、命令查詢和原始SQL查詢

Symfony vs Yii2:哪個框架比較適合開發大型Web應用? Symfony vs Yii2:哪個框架比較適合開發大型Web應用? Jun 19, 2023 am 10:57 AM

隨著Web應用需求的不斷增長,開發者在選擇開發框架方面也越來越有選擇的空間。 Symfony和Yii2是兩個備受歡迎的PHP框架,它們都具有強大的功能和效能,但在面對需要開發大型網路應用程式時,哪個框架更適合呢?接下來我們將對Symphony和Yii2進行比較分析,以幫助你更好地進行選擇。基本概述Symphony是一個由PHP編寫的開源Web應用框架,它是建立

Yii2程式設計指南:執行Cron服務的方法 Yii2程式設計指南:執行Cron服務的方法 Sep 01, 2023 pm 11:21 PM

如果您問「Yii是什麼?」請參閱我之前的教學:Yii框架簡介,其中回顧了Yii的優點,並概述了2014年10月發布的Yii2.0的新增功能。嗯>在這個使用Yii2程式設計系列中,我將指導讀者使用Yii2PHP框架。在今天的教學中,我將與您分享如何利用Yii的控制台功能來執行cron作業。過去,我在cron作業中使用了wget—可透過Web存取的URL來執行我的後台任務。這引發了安全性問題並存在一些效能問題。雖然我在我們的啟動系列安全性專題中討論了一些減輕風險的方法,但我曾希望過渡到控制台驅動的命令

Yii2 vs Symfony:哪個框架比較適合API開發? Yii2 vs Symfony:哪個框架比較適合API開發? Jun 18, 2023 pm 11:00 PM

隨著網路的快速發展,API成為了各種應用間資料交換的重要方式。因此,開發一款易於維護、高效、穩定的API框架變得越來越重要。而在選擇API框架時,Yii2和Symfony是兩個備受開發者歡迎的選擇。那麼,哪一個比較適合API開發呢?本文將對這兩個框架進行比較,並給出一些結論。一、基本介紹Yii2和Symfony都是成熟的PHP框架,都有相應的擴展,可以用來開

yii與Docker:容器化和部署您的應用程序 yii與Docker:容器化和部署您的應用程序 Apr 02, 2025 pm 02:13 PM

使用Docker容器化和部署Yii應用的步驟包括:1.創建Dockerfile,定義鏡像構建過程;2.使用DockerCompose啟動Yii應用和MySQL數據庫;3.優化鏡像大小和性能。這不僅涉及到具體的技術操作,還包括理解Dockerfile的工作原理和最佳實踐,以確保高效、可靠的部署。

See all articles