摘要:全局级别利用实例在整个应用的生命周期中全局可访问的特性,来实现这个全局事件的。类级别通过维护类的属性数组,触发事件时通过类名和事件名称取到当前类以及父类的数据,再通过函数触发。
概念理解:在某一个事件(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]你就明白了。由于水平有限,欢迎小伙伴交流和指正。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/31545.html
摘要:概念理解第一次看深入理解的时候,我也是懵逼的,属性不就是类的属性吗,有什么好说的。属性的实现步骤继承自。声明一个用于保存该属性的私有成员变量。如果只提供了,那么该属性为只读属性,只提供了,则为只写。 概念理解:第一次看深入理解Yii2.0的时候,我也是懵逼的,属性不就是类的属性吗,有什么好说的。后来才知道Yii框架对成员变量和属性做了区分,那类的成员变量和属性到底是什么关系又有什么区别...
摘要:概念理解使用行为可以在不修改现有类的情况下,对类的功能进行扩充。最后将行为名称和行为实例放到的属性中,至此,行为的绑定就结束了。不过在解除的时候虽然都是删掉相应的,但是解除行为还需要解除在绑定行为的时候绑定的事件,这点不太一样。 概念理解:使用行为(behavior)可以在不修改现有类的情况下,对类的功能进行扩充。 通过将行为绑定到一个类,可以使类具有行为本身所定义的属性和方法,就好像...
摘要:因为阻止事件冒泡的行为只能用于合成事件中,没法阻止原生事件的冒泡。同时的创建和冒泡是在原生事件冒泡到最顶层的之后的。浅析之事件系统一 上篇文章中,我们谈到了React事件系统的实现方式,和在React中使用原生事件的方法,那么这篇文章我们来继续分析下,看看React中合成事件和原生事件混用的各种情况。 上一个例子 在上篇文章中,我们举了个例子。为了防止大家不记得,我们来看看那个例子的代...
摘要:同时,如果执行的过程中发现其他函数,继续入栈然后执行。上面我们讨论的其实都是同步代码,代码在运行的时候只用调用栈解释就可以了。 序 Event Loop 这个概念相信大家或多或少都了解过,但是有一次被一个小伙伴问到它具体的原理的时候,感觉自己只知道个大概印象,于是计划着写一篇文章,用输出倒逼输入,让自己重新学习这个概念,同时也能帮助更多的人理解它~ 概念 JavaScript 是一门 ...
阅读 3287·2021-11-25 09:43
阅读 1253·2021-11-23 09:51
阅读 3577·2021-10-11 11:06
阅读 3636·2021-08-31 09:41
阅读 3574·2019-08-30 15:53
阅读 3442·2019-08-30 15:53
阅读 941·2019-08-30 15:43
阅读 3278·2019-08-29 14:02