摘要:全局級(jí)別利用實(shí)例在整個(gè)應(yīng)用的生命周期中全局可訪問(wèn)的特性,來(lái)實(shí)現(xiàn)這個(gè)全局事件的。類級(jí)別通過(guò)維護(hù)類的屬性數(shù)組,觸發(fā)事件時(shí)通過(guò)類名和事件名稱取到當(dāng)前類以及父類的數(shù)據(jù),再通過(guò)函數(shù)觸發(fā)。
概念理解:在某一個(gè)事件(trigger)發(fā)生的時(shí)候,觸發(fā)預(yù)先設(shè)定(on)的代碼,這是代碼解耦的一種方式。事件按照級(jí)別分為三類 1. 實(shí)例級(jí)別
綁定事件、觸發(fā)事件的類繼承的是Component,只在當(dāng)前示例中運(yùn)行,不與類的其他實(shí)例發(fā)生關(guān)系,也不與其他類、其他實(shí)例發(fā)生關(guān)系。
代碼示例: data; $event->handled = true; } public function sayWorld($event) { echo $event->data; } } 1.綁定事件: $event = new EventTest(); $event->on(EventTest::EVENT_SAY_HELLO, [$event, "sayHello"], "Hello!"); $event->on(EventTest::EVENT_SAY_HELLO, [$event, "sayWorld"], "World!"); 2.解除事件: $event->off(EventTest::EVENT_SAY_HELLO, [$event, "sayHello"]); 3.觸發(fā)事件: $event->trigger( EventTest::EVENT_SAY_HELLO);2. 類級(jí)別
綁定事件、觸發(fā)事件的類繼承的是Event,類級(jí)別事件會(huì)被類自身、類的實(shí)例、后代類、后代類實(shí)例的同一事件所觸發(fā),影響范圍更大
代碼示例: data; } public function sayWorld($event) { echo $event->data; } } 1.綁定事件: $event = new EventTest(); $event->on("commoncomponentsEventTest", EventTest::EVENT_SAY_HELLO, [$event, "sayHello"], "Hello!"); $event->on("commoncomponentsEventTest", EventTest::EVENT_SAY_HELLO, [$event, "sayWorld"], "World!"); 2.解除事件: $event->off("commoncomponentsEventTest", EventTest::EVENT_SAY_HELLO, [$event, "sayWorld"]); 3.觸發(fā)事件: $event->trigger("commoncomponentsEventTest", EventTest::EVENT_SAY_HELLO); 類級(jí)別參數(shù)比實(shí)例級(jí)別多一個(gè)參數(shù):類名
注意: 解除事件如果不傳 handle,則會(huì)解除該事件下的所有 handle。 在其中一個(gè) handle 里面加上 $event->handled = true 也會(huì)阻止后續(xù) handle 的觸發(fā),如上代碼。3. 全局級(jí)別
利用Application實(shí)例在整個(gè)應(yīng)用的生命周期中全局可訪問(wèn)的特性,來(lái)實(shí)現(xiàn)這個(gè)全局事件的。在任意需要的時(shí)候,都可以觸發(fā)全局事件,也可以在任意必要的時(shí)候綁定,或解除一個(gè)事件。
代碼示例: 1.綁定事件: $event = new EventTest(); Yii::$app->on("global_event", [$event, "globalEvent"], "global event"); 2.觸發(fā)事件: Yii::$app->trigger("global_event"); 全局級(jí)別實(shí)際上也是一個(gè)特殊的實(shí)例。[注意所謂全局其實(shí)作用范圍也只是在當(dāng)前請(qǐng)求的生命周期有效,而非當(dāng)前會(huì)話(簡(jiǎn)單的說(shuō),打開(kāi)瀏覽器,訪問(wèn)服務(wù)器,直到瀏覽器關(guān)閉,稱為一次會(huì)話)]原理
實(shí)例級(jí)別通過(guò)維護(hù)Component類的屬性 $_events 數(shù)組,觸發(fā)事件時(shí)通過(guò)[事件名稱]取到[當(dāng)前實(shí)例]的handle數(shù)據(jù),再通過(guò)函數(shù)call_user_func觸發(fā)handle。
類級(jí)別通過(guò)維護(hù)Event類的屬性 $_events 數(shù)組,觸發(fā)事件時(shí)通過(guò)[類名和事件名稱]取到[當(dāng)前類以及父類]的handle數(shù)據(jù),再通過(guò)函數(shù)call_user_func觸發(fā)handle。
Component 的 $_event 數(shù)據(jù)結(jié)構(gòu)示例如下
Array ( [say_hello] => Array ( [0] => Array ( [0] => Array ( [0] => commoncomponentsEventTest Object ( [_events:yiiaseComponent:private] => Array *RECURSION* [_eventWildcards:yiiaseComponent:private] => Array ( ) [_behaviors:yiiaseComponent:private] => Array ( ) ) [1] => say_hello ) [1] => Hello! ) ) )小結(jié)
以上總結(jié)參考了深入理解Yii2.0,其實(shí)以前就看過(guò),但是也只是局限于看過(guò),沒(méi)有自己跑demo調(diào)試、查看源代碼,然后就誤以為自己明白了,其實(shí)過(guò)倆天什么都不記得了。所以現(xiàn)在通過(guò)寫博客來(lái)加深自己的理解,這篇博客其實(shí)主要講的還是事件的使用,具體原理一帶而過(guò),如果有小伙伴一知半解,可能查看一下源代碼[yiiaseComponent yiiaseEvent]你就明白了。由于水平有限,歡迎小伙伴交流和指正。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/31545.html
摘要:概念理解第一次看深入理解的時(shí)候,我也是懵逼的,屬性不就是類的屬性嗎,有什么好說(shuō)的。屬性的實(shí)現(xiàn)步驟繼承自。聲明一個(gè)用于保存該屬性的私有成員變量。如果只提供了,那么該屬性為只讀屬性,只提供了,則為只寫。 概念理解:第一次看深入理解Yii2.0的時(shí)候,我也是懵逼的,屬性不就是類的屬性嗎,有什么好說(shuō)的。后來(lái)才知道Yii框架對(duì)成員變量和屬性做了區(qū)分,那類的成員變量和屬性到底是什么關(guān)系又有什么區(qū)別...
摘要:概念理解使用行為可以在不修改現(xiàn)有類的情況下,對(duì)類的功能進(jìn)行擴(kuò)充。最后將行為名稱和行為實(shí)例放到的屬性中,至此,行為的綁定就結(jié)束了。不過(guò)在解除的時(shí)候雖然都是刪掉相應(yīng)的,但是解除行為還需要解除在綁定行為的時(shí)候綁定的事件,這點(diǎn)不太一樣。 概念理解:使用行為(behavior)可以在不修改現(xiàn)有類的情況下,對(duì)類的功能進(jìn)行擴(kuò)充。 通過(guò)將行為綁定到一個(gè)類,可以使類具有行為本身所定義的屬性和方法,就好像...
摘要:因?yàn)樽柚故录芭莸男袨橹荒苡糜诤铣墒录校瑳](méi)法阻止原生事件的冒泡。同時(shí)的創(chuàng)建和冒泡是在原生事件冒泡到最頂層的之后的。淺析之事件系統(tǒng)一 上篇文章中,我們談到了React事件系統(tǒng)的實(shí)現(xiàn)方式,和在React中使用原生事件的方法,那么這篇文章我們來(lái)繼續(xù)分析下,看看React中合成事件和原生事件混用的各種情況。 上一個(gè)例子 在上篇文章中,我們舉了個(gè)例子。為了防止大家不記得,我們來(lái)看看那個(gè)例子的代...
摘要:同時(shí),如果執(zhí)行的過(guò)程中發(fā)現(xiàn)其他函數(shù),繼續(xù)入棧然后執(zhí)行。上面我們討論的其實(shí)都是同步代碼,代碼在運(yùn)行的時(shí)候只用調(diào)用棧解釋就可以了。 序 Event Loop 這個(gè)概念相信大家或多或少都了解過(guò),但是有一次被一個(gè)小伙伴問(wèn)到它具體的原理的時(shí)候,感覺(jué)自己只知道個(gè)大概印象,于是計(jì)劃著寫一篇文章,用輸出倒逼輸入,讓自己重新學(xué)習(xí)這個(gè)概念,同時(shí)也能幫助更多的人理解它~ 概念 JavaScript 是一門 ...
摘要:事件有很多,有我用過(guò)的有我沒(méi)用過(guò)的,今天我想分析一番。阻止默認(rèn)事件,表單提交,標(biāo)簽。觸發(fā)事件的元素,事件委托會(huì)用到。在文本插入文本框之前會(huì)觸發(fā)事件。 一個(gè)網(wǎng)頁(yè)由三層組成(html 結(jié)構(gòu),js 行為,css 表現(xiàn)),一切的東西其實(shí)都建立在html上,html里面的dom提供了一些事件,然后通過(guò)js封裝,我們可以用js去調(diào)用dom上的事件。事件有很多,有我用過(guò)的有我沒(méi)用過(guò)的,今天我想分析一...
閱讀 3418·2021-11-25 09:43
閱讀 1387·2021-11-23 09:51
閱讀 3700·2021-10-11 11:06
閱讀 3872·2021-08-31 09:41
閱讀 3651·2019-08-30 15:53
閱讀 3584·2019-08-30 15:53
閱讀 1022·2019-08-30 15:43
閱讀 3404·2019-08-29 14:02