国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

目錄
Yii框架組件和事件行為管理詳解,yii行為管理
首頁(yè) 後端開發(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()來(lái)訪問和設(shè)置屬性,但這些方法的作用遠(yuǎn)不指這些。下面用__get()來(lái)說(shuō)明

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步可以看出來(lái)行為的作用是完全擴(kuò)展組件的特性,可以是屬性、方法、事件甚至行為,這樣使程序開發(fā)更加靈活。

行為的另一個(gè)作用是將相似事件句柄放在一起,在行為執(zhí)行attach()方法的時(shí)候會(huì)將events()方法中返回的事件句柄綁定,這樣做達(dá)到方面管理和擴(kuò)展的目的。比如CModelBehavior中將model相關(guān)的事件集中起來(lái),便于其子類的復(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)頁(yè)開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

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

如何安裝Win10舊版元件DirectPlay 如何安裝Win10舊版元件DirectPlay Dec 28, 2023 pm 03:43 PM

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

在iPhone鎖定畫面上取得即將到來(lái)的日曆事件 在iPhone鎖定畫面上取得即將到來(lái)的日曆事件 Dec 01, 2023 pm 02:21 PM

在運(yùn)行iOS16或更高版本的iPhone上,您可以直接在鎖定畫面上顯示即將到來(lái)的日曆事件。繼續(xù)閱讀以了解它是如何完成的。由於錶盤複雜功能,許多AppleWatch用戶習(xí)慣能夠看一眼手腕來(lái)查看下一個(gè)即將到來(lái)的日曆事件。隨著iOS16和鎖定螢?zāi)恍〔考某霈F(xiàn),您可以直接在iPhone上查看相同的日曆事件訊息,甚至無(wú)需解鎖設(shè)備。日曆鎖定螢?zāi)恍≡袃煞N風(fēng)格,可讓您追蹤下一個(gè)即將發(fā)生的事件的時(shí)間,或使用更大的小元件來(lái)顯示事件名稱及其時(shí)間。若要開始新增小元件,請(qǐng)使用面容ID或觸控ID解鎖iPhone,長(zhǎng)按

如何開啟win10舊版組件的設(shè)置 如何開啟win10舊版組件的設(shè)置 Dec 22, 2023 am 08:45 AM

win10舊版元件是需要使用者自己去設(shè)定裡面打開的,因?yàn)楹芏嗟脑綍r(shí)都是預(yù)設(shè)關(guān)閉的狀態(tài),首先我們需要進(jìn)入到設(shè)定裡面,操作很簡(jiǎn)單,跟著下面的步驟來(lái)就可以了win10舊版元件在哪裡開啟1、點(diǎn)選開始,然後點(diǎn)選「win系統(tǒng)」2、點(diǎn)選進(jìn)入控制臺(tái)3、再點(diǎn)選下面的程式4、點(diǎn)選「啟用或關(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)能力。

Vue組件實(shí)戰(zhàn):分頁(yè)組件開發(fā) Vue組件實(shí)戰(zhàn):分頁(yè)組件開發(fā) Nov 24, 2023 am 08:56 AM

Vue元件實(shí)戰(zhàn):分頁(yè)元件開發(fā)介紹在網(wǎng)路應(yīng)用程式中,分頁(yè)功能是不可或缺的一個(gè)元件。一個(gè)好的分頁(yè)元件應(yīng)該展示簡(jiǎn)潔明了,功能豐富,而且易於整合和使用。在本文中,我們將介紹如何使用Vue.js框架來(lái)開發(fā)一個(gè)高度可自訂化的分頁(yè)元件。我們將透過程式碼範(fàn)例來(lái)詳細(xì)說(shuō)明如何使用Vue元件開發(fā)。技術(shù)堆疊Vue.js2.xJavaScript(ES6)HTML5和CSS3開發(fā)環(huán)

Vue元件開發(fā):進(jìn)度條元件實(shí)作方法 Vue元件開發(fā):進(jìn)度條元件實(shí)作方法 Nov 24, 2023 am 08:56 AM

Vue元件開發(fā):進(jìn)度條元件實(shí)作方法前言:在Web開發(fā)中,進(jìn)度列是一種常見的UI元件,在資料要求、檔案上傳、表單提交等場(chǎng)景中常用來(lái)顯示作業(yè)的進(jìn)度。在Vue.js中,透過自訂元件的方式,我們可以很方便地實(shí)作一個(gè)進(jìn)度條元件,本文將介紹一種實(shí)作方法,並提供具體的程式碼範(fàn)例。希望能對(duì)Vue.js初學(xué)者有幫助。組件的結(jié)構(gòu)和樣式首先,我們需要定義進(jìn)度條組件的基本結(jié)構(gòu)和樣

Vue元件開發(fā):下拉式選單元件實(shí)作方法 Vue元件開發(fā):下拉式選單元件實(shí)作方法 Nov 24, 2023 am 08:29 AM

Vue元件開發(fā):下拉式選單元件實(shí)作方法在Vue.js中,下拉式選單是一個(gè)常見的UI元件,用來(lái)顯示一組選項(xiàng)供使用者選擇。本文將介紹如何使用Vue.js開發(fā)一個(gè)下拉式選單元件,並提供具體的程式碼範(fàn)例。建立Vue元件首先,我們需要建立一個(gè)Vue元件來(lái)表示下拉式選單。在Vue實(shí)例的components選項(xiàng)中註冊(cè)這個(gè)元件,讓它可以在其他元件中使用。 //DropdownMenu.

Vue中如何處理元件的動(dòng)態(tài)載入和切換 Vue中如何處理元件的動(dòng)態(tài)載入和切換 Oct 15, 2023 pm 04:34 PM

Vue中處理組件的動(dòng)態(tài)載入和切換Vue是一個(gè)流行的JavaScript框架,它提供了各種靈活的功能來(lái)處理組件的動(dòng)態(tài)載入和切換。在本文中,我們將討論一些Vue中處理元件動(dòng)態(tài)載入和切換的方法,並提供具體的程式碼範(fàn)例。動(dòng)態(tài)載入元件是指根據(jù)需要在執(zhí)行時(shí)期動(dòng)態(tài)載入元件。這樣可以提高應(yīng)用程式的效能和載入速度,因?yàn)橹挥挟?dāng)需要時(shí)才會(huì)載入相關(guān)的元件。 Vue提供了async和awa

See all articles