摘要:全局級別利用實例在整個應(yīng)用的生命周期中全局可訪問的特性,來實現(xiàn)這個全局事件的。類級別通過維護類的屬性數(shù)組,觸發(fā)事件時通過類名和事件名稱取到當(dāng)前類以及父類的數(shù)據(jù),再通過函數(shù)觸發(fā)。
概念理解:在某一個事件(trigger)發(fā)生的時候,觸發(fā)預(yù)先設(shè)定(on)的代碼,這是代碼解耦的一種方式。事件按照級別分為三類 1. 實例級別
綁定事件、觸發(fā)事件的類繼承的是Component,只在當(dāng)前示例中運行,不與類的其他實例發(fā)生關(guān)系,也不與其他類、其他實例發(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. 類級別
綁定事件、觸發(fā)事件的類繼承的是Event,類級別事件會被類自身、類的實例、后代類、后代類實例的同一事件所觸發(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); 類級別參數(shù)比實例級別多一個參數(shù):類名
注意: 解除事件如果不傳 handle,則會解除該事件下的所有 handle。 在其中一個 handle 里面加上 $event->handled = true 也會阻止后續(xù) handle 的觸發(fā),如上代碼。3. 全局級別
利用Application實例在整個應(yīng)用的生命周期中全局可訪問的特性,來實現(xiàn)這個全局事件的。在任意需要的時候,都可以觸發(fā)全局事件,也可以在任意必要的時候綁定,或解除一個事件。
代碼示例: 1.綁定事件: $event = new EventTest(); Yii::$app->on("global_event", [$event, "globalEvent"], "global event"); 2.觸發(fā)事件: Yii::$app->trigger("global_event"); 全局級別實際上也是一個特殊的實例。[注意所謂全局其實作用范圍也只是在當(dāng)前請求的生命周期有效,而非當(dāng)前會話(簡單的說,打開瀏覽器,訪問服務(wù)器,直到瀏覽器關(guān)閉,稱為一次會話)]原理
實例級別通過維護Component類的屬性 $_events 數(shù)組,觸發(fā)事件時通過[事件名稱]取到[當(dāng)前實例]的handle數(shù)據(jù),再通過函數(shù)call_user_func觸發(fā)handle。
類級別通過維護Event類的屬性 $_events 數(shù)組,觸發(fā)事件時通過[類名和事件名稱]取到[當(dāng)前類以及父類]的handle數(shù)據(jù),再通過函數(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,其實以前就看過,但是也只是局限于看過,沒有自己跑demo調(diào)試、查看源代碼,然后就誤以為自己明白了,其實過倆天什么都不記得了。所以現(xiàn)在通過寫博客來加深自己的理解,這篇博客其實主要講的還是事件的使用,具體原理一帶而過,如果有小伙伴一知半解,可能查看一下源代碼[yiiaseComponent yiiaseEvent]你就明白了。由于水平有限,歡迎小伙伴交流和指正。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/31545.html
摘要:概念理解第一次看深入理解的時候,我也是懵逼的,屬性不就是類的屬性嗎,有什么好說的。屬性的實現(xiàn)步驟繼承自。聲明一個用于保存該屬性的私有成員變量。如果只提供了,那么該屬性為只讀屬性,只提供了,則為只寫。 概念理解:第一次看深入理解Yii2.0的時候,我也是懵逼的,屬性不就是類的屬性嗎,有什么好說的。后來才知道Yii框架對成員變量和屬性做了區(qū)分,那類的成員變量和屬性到底是什么關(guān)系又有什么區(qū)別...
摘要:概念理解使用行為可以在不修改現(xiàn)有類的情況下,對類的功能進行擴充。最后將行為名稱和行為實例放到的屬性中,至此,行為的綁定就結(jié)束了。不過在解除的時候雖然都是刪掉相應(yīng)的,但是解除行為還需要解除在綁定行為的時候綁定的事件,這點不太一樣。 概念理解:使用行為(behavior)可以在不修改現(xiàn)有類的情況下,對類的功能進行擴充。 通過將行為綁定到一個類,可以使類具有行為本身所定義的屬性和方法,就好像...
摘要:因為阻止事件冒泡的行為只能用于合成事件中,沒法阻止原生事件的冒泡。同時的創(chuàng)建和冒泡是在原生事件冒泡到最頂層的之后的。淺析之事件系統(tǒng)一 上篇文章中,我們談到了React事件系統(tǒng)的實現(xiàn)方式,和在React中使用原生事件的方法,那么這篇文章我們來繼續(xù)分析下,看看React中合成事件和原生事件混用的各種情況。 上一個例子 在上篇文章中,我們舉了個例子。為了防止大家不記得,我們來看看那個例子的代...
摘要:同時,如果執(zhí)行的過程中發(fā)現(xiàn)其他函數(shù),繼續(xù)入棧然后執(zhí)行。上面我們討論的其實都是同步代碼,代碼在運行的時候只用調(diào)用棧解釋就可以了。 序 Event Loop 這個概念相信大家或多或少都了解過,但是有一次被一個小伙伴問到它具體的原理的時候,感覺自己只知道個大概印象,于是計劃著寫一篇文章,用輸出倒逼輸入,讓自己重新學(xué)習(xí)這個概念,同時也能幫助更多的人理解它~ 概念 JavaScript 是一門 ...
閱讀 3330·2021-11-25 09:43
閱讀 1314·2021-11-23 09:51
閱讀 3617·2021-10-11 11:06
閱讀 3729·2021-08-31 09:41
閱讀 3607·2019-08-30 15:53
閱讀 3517·2019-08-30 15:53
閱讀 974·2019-08-30 15:43
閱讀 3317·2019-08-29 14:02