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