亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

目錄
Yii框架組件和事件行為管理詳解,yii行為管理
首頁 後端開發(fā) php教程 Yii框架組件和事件行為管理詳解,yii行為管理_PHP教程

Yii框架組件和事件行為管理詳解,yii行為管理_PHP教程

Jul 12, 2016 am 08:50 AM
yii 事件 組件

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

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

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

組件管理

YII是一個(gè)純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或者其子類對(duì)象實(shí)例$obj->name的時(shí)候,__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、拋出異常:請(qǐng)求的屬性不存在。

在CComponent子類中可以重載__get()方法,如在CModule中加入了獲取組件的判斷。這就注意一個(gè)問題了屬性和組件名最好不要重名,因?yàn)槌绦驎?huì)優(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)中有個(gè)疑問:注冊(cè)框架核心組件的時(shí)候一下子加載這么多,是不是影響性能呢?其實(shí)沒有,注冊(cè)的時(shí)候只是把組件和其對(duì)應(yīng)的配置用鍵值對(duì)的形式保存在數(shù)組中(預(yù)加載的除外),當(dāng)用到時(shí)候才像上面那樣去創(chuàng)建組件,會(huì)通過YIIBase中的createComponent()方法創(chuàng)建,并初始化。通過CModule或其子孫類(如CWebApplication)調(diào)用__get()或getComponent()獲取組件時(shí),CModule通過$_components數(shù)組建立對(duì)象池,確保每個(gè)組件在一次請(qǐng)求中只實(shí)例化一次。

事件行為管理

事件相當(dāng)于對(duì)一個(gè)組件的擴(kuò)展或者插件,以組件中預(yù)留的鉤子實(shí)現(xiàn)組件內(nèi)部調(diào)用外部、外部對(duì)組件部分控制。在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()方法在處理請(qǐng)求之前先判斷外部是否傳人onBeginRequest事件的句柄,如果有則通過onBeginRequest($event)方法調(diào)用CComponent中的raiseEvent()方法執(zhí)行句柄中的函數(shù)或者方法。

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

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

PS:小編在這里推薦一款本站的php格式化美化的排版工具幫助大家在以后的PHP程序設(shè)計(jì)中進(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日期與時(shí)間用法總結(jié)》、《php面向?qū)ο蟪绦蛟O(shè)計(jì)入門教程》、《php字符串(string)用法總結(jié)》、《php+mysql數(shù)據(jù)庫(kù)操作入門教程》及《php常見數(shù)據(jù)庫(kù)操作技巧匯總》

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

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/1133126.htmlTechArticleYii框架組件和事件行為管理詳解,yii行為管理 本文實(shí)例講述了Yii框架組件和事件行為管理。分享給大家供大家參考,具體如下: Yii是一個(gè)...
本網(wǎng)站聲明
本文內(nèi)容由網(wǎng)友自願(yuàn)投稿,版權(quán)歸原作者所有。本站不承擔(dān)相應(yīng)的法律責(zé)任。如發(fā)現(xiàn)涉嫌抄襲或侵權(quán)的內(nèi)容,請(qǐng)聯(lián)絡(luò)admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅(qū)動(dòng)的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

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

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

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

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強(qiáng)大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

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

熱門話題

Laravel 教程
1597
29
PHP教程
1488
72
如何安裝Win10舊版元件DirectPlay 如何安裝Win10舊版元件DirectPlay Dec 28, 2023 pm 03:43 PM

不少用戶在玩win10的的一些遊戲的時(shí)候總是會(huì)遇到一些問題,比如說卡屏和花屏等等情況,這個(gè)時(shí)候我們是可以採(cǎi)用打開directplay這個(gè)功能來解決的,而且功能的操作方法也很簡(jiǎn)單。 win10舊版元件directplay怎麼安裝1、在搜尋框裡面輸入「控制臺(tái)」然後開啟2、檢視方式選擇大圖示3、找到「程式與功能」4、點(diǎn)選左側(cè)的啟用或關(guān)閉win功能5、選擇舊版這裡的勾選上就可以了

Angular元件及其顯示屬性:了解非block預(yù)設(shè)值 Angular元件及其顯示屬性:了解非block預(yù)設(shè)值 Mar 15, 2024 pm 04:51 PM

Angular框架中元件的預(yù)設(shè)顯示行為不是區(qū)塊級(jí)元素。這種設(shè)計(jì)選擇促進(jìn)了元件樣式的封裝,並鼓勵(lì)開發(fā)人員有意識(shí)地定義每個(gè)元件的顯示方式。透過明確設(shè)定CSS屬性 display,Angular組件的顯示可以完全控制,從而實(shí)現(xiàn)所需的佈局和響應(yīng)能力。

如何使用 PHP 建立基於事件的應(yīng)用程式 如何使用 PHP 建立基於事件的應(yīng)用程式 May 04, 2024 pm 02:24 PM

在PHP中建構(gòu)基於事件的應(yīng)用程式的方法包括:使用EventSourceAPI建立事件來源,並在客戶端使用EventSource物件監(jiān)聽事件。使用伺服器傳送的事件(SSE)傳送事件,並在客戶端使用XMLHttpRequest物件監(jiān)聽事件。一個(gè)實(shí)用的例子是在電子商務(wù)網(wǎng)站中使用EventSource即時(shí)更新庫(kù)存計(jì)數(shù),在伺服器端透過隨機(jī)更改庫(kù)存並發(fā)送更新來實(shí)現(xiàn),客戶端則透過EventSource監(jiān)聽?zhēng)齑娓聛K即時(shí)顯示。

jQuery中如何實(shí)作select元素的改變事件綁定 jQuery中如何實(shí)作select元素的改變事件綁定 Feb 23, 2024 pm 01:12 PM

jQuery是一個(gè)受歡迎的JavaScript函式庫(kù),可以用來簡(jiǎn)化DOM操作、事件處理、動(dòng)畫效果等。在web開發(fā)中,常常會(huì)遇到需要對(duì)select元素進(jìn)行改變事件綁定的情況。本文將介紹如何使用jQuery實(shí)作對(duì)select元素改變事件的綁定,並提供具體的程式碼範(fàn)例。首先,我們需要使用標(biāo)籤來建立一個(gè)包含選項(xiàng)的下拉式選單:

php框架laravel和yii區(qū)別是什麼 php框架laravel和yii區(qū)別是什麼 Apr 30, 2025 pm 02:24 PM

Laravel和Yii的主要區(qū)別在於設(shè)計(jì)理念、功能特性和使用場(chǎng)景。 1.Laravel注重開發(fā)的簡(jiǎn)潔和愉悅,提供豐富的功能如EloquentORM和Artisan工具,適合快速開發(fā)和初學(xué)者。 2.Yii強(qiáng)調(diào)性能和效率,適用於高負(fù)載應(yīng)用,提供高效的ActiveRecord和緩存系統(tǒng),但學(xué)習(xí)曲線較陡。

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

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

深入研究jQuery中的關(guān)閉按鈕事件 深入研究jQuery中的關(guān)閉按鈕事件 Feb 24, 2024 pm 05:09 PM

深入理解jQuery中的關(guān)閉按鈕事件在前端開發(fā)過程中,經(jīng)常會(huì)遇到需要實(shí)現(xiàn)關(guān)閉按鈕功能的情況,例如關(guān)閉彈跳窗、關(guān)閉提示框等。而在使用jQuery這個(gè)流行的JavaScript函式庫(kù)時(shí),實(shí)作關(guān)閉按鈕事件也變得異常簡(jiǎn)單又方便。本文將深入探討如何利用jQuery來實(shí)現(xiàn)關(guān)閉按鈕事件,並提供具體的程式碼範(fàn)例,幫助讀者更好地理解和掌握這個(gè)技術(shù)。首先,我們需要了解在HTML中如何定

如何使用 PHP 建立可重複使用的元件 如何使用 PHP 建立可重複使用的元件 May 01, 2024 pm 04:57 PM

PHP元件為程式碼重複使用提供了模組化區(qū)塊。建立元件涉及建立一個(gè)包含邏輯和功能的類別並將其註冊(cè)到自動(dòng)載入器中。組件透過其類別使用,例如一個(gè)計(jì)算銷售稅的組件。實(shí)戰(zhàn)案例展示了使用組件在電子商務(wù)應(yīng)用程式中計(jì)算基於地址的銷售稅。透過元件,應(yīng)用程式可以簡(jiǎn)化稅務(wù)計(jì)算,並集中管理稅率變更。

See all articles