Yii框架組件和事件行為管理詳解,yii行為管理_PHP教程
Jul 12, 2016 am 08:50 AMYii框架組件和事件行為管理詳解,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ì)有所幫助。

熱AI工具

Undress AI Tool
免費(fèi)脫衣圖片

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

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

Clothoff.io
AI脫衣器

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

熱門文章

熱工具

記事本++7.3.1
好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強(qiáng)大的PHP整合開發(fā)環(huán)境

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

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

熱門話題

不少用戶在玩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、選擇舊版這裡的勾選上就可以了

在運(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è)定裡面打開的,因?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框架中元件的預(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ā)介紹在網(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í)作方法前言:在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.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是一個(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
