资讯专栏INFORMATION COLUMN

Yii源码解读 - 事件

AaronYuan / 3030人阅读

摘要:事件的绑定和解除对事件进行绑定和解绑。使用全局函数作为来进行绑定使用对象的成员函数来进行绑定使用类的静态成员函数进行绑定使用匿名函数上面的数组是用来维护事件数组。事件的级别类级别事件类级别事件用于响应所有类实例的事件。

Yii基础 事件 event

使用事件,可以在特定的时点,触发执行预先设定的一段代码,事件既是代码解耦的一种方式,也是设计业务流程的一种模式。

事件的相关要素

这是一个什么事件?

谁触发了事件?

谁负责监听这个事件?

事件怎么处理?

事件的相关数据是什么?

事件的引入

事件是从yiiaseComponent类开始出现的。与事件相关的另外一个类是yiiaseEvent,他封装了一些方法,同时提供一些辅助。

事件handler

事件handler就是事件处理程序,负责事件触发后应该怎么办。handler可以是以下形式:

函数名

对象的方法,或类的静态方法

匿名函数

一个handler必须是以下方式

function ($event){
    // $event就是yiiaseEvent
}

handler的调用是通过call_user_func()来实现的。

事件的绑定和解除

yiiaseComponent::on(), yiiaseComponent::off()对事件进行绑定和解绑。

person = new Person;

// 使用PHP全局函数作为handler来进行绑定
$person->on(Person::EVENT_GREET, "person_say_hello");

// 使用对象$obj的成员函数say_hello来进行绑定
$person->on(Person::EVENT_GREET, [$obj, "say_hello"]);

// 使用类Greet的静态成员函数say_hello进行绑定
$person->on(Person::EVENT_GREET, ["apphelperGreet", "say_hello"]);

// 使用匿名函数
$person->on(Person::EVENT_GREET, function ($event) {
    echo "Hello";
});
private _events = [];

上面的数组是用来维护事件handler数组。该数组的下标为事件名,数组元素是形为一系列 [$handler, $data] 的数组

handler$event[]数组中的位置很重要,代表的是执行的先后顺序。执行的先后顺序很重要。

在解除事件时,可以把一个事件下的所有handler都解除掉。

事件的触发

事件的触发,需要调用yiiaseComponent::trigger()

yiiaseApplication->run(),很好的举例说明了触发器如何调用。

使用 yiiaseComponent::on() 可以为各种事件绑定handler,也可以为同一事件绑定多个handler。
triggeron传入数据方法不同。在on()中,使用一个简单变量,传入,并在handler中通过$event->data进行访问。这个是在绑定时确定的数据。而有的数据是没办法在绑定时确定的。

事件的级别 类级别事件

类级别事件用于响应所有类实例的事件。

类级别事件的绑定需要使用yiiaseEvent::on()

类级别事件的触发仍然是在yiiaseComponent::trigger()

类级别事件的触发,应使用yiiaseEvent::trigger()。这个函数不会触发实例级别的事件。

全局事件

利用了Application实例在整个应用的生命周期中全局可访问的特性,来实现这个全局事件的。当然,你也可以将他绑定在任意全局可访问的的Component上。

全局事件一个最大优势在于:在任意需要的时候,都可以触发全局事件,也可以在任意必要的时候绑定,或解除一个事件:

Yii::$app->on("bar", function ($event) {
    echo get_class($event->sender);
});

Yii::$app->trigger("bar", new Event(["sender" => $this]));

上面的Yii::$app->on()可以在任何地方调用,就可以完成事件的绑定。而 Yii::$app->trigger()只要在绑定之后的任何时候调用就OK了。

参考

http://www.digpage.com

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/21437.html

相关文章

  • Yii源码解读-行为

    摘要:行为所要响应的事件重载方法,表示这个行为将对类何种事件进行何种反馈。行为用的最多的,也是对于各种事件的响应。当出现命名冲突时,行为会自行排除冲突,自动使用先绑定的行为。目前还没有能支持行为。 Yii基础 行为(Behavior) 行为(behavior)可以在不修改现有类的情况下,对类的功能进行扩充。 通过将行为绑定到一个类,可以使类具有行为本身所定义的属性和方法,就好像类本来就有这些...

    IntMain 评论0 收藏0
  • Yii源码解读-环境&配置

    摘要:环境需要了解一下一个纯粹的与本地环境密切相关的配置项。对于配置项以数组进行组织。数组元素表示将要创建的对象的完整类名。数组元素表示指定为属性的初始值为。数组元素表示将绑定到对象的事件中。对于形式配置项,视配置值为一个事件,绑定到上。 环境 需要了解一下cookieValidationKey:一个纯粹的、与本地环境密切相关的配置项。 但是,在有些情况下,cookieValidationK...

    cgh1999520 评论0 收藏0
  • Yii源码解读-属性

    摘要:成员变量可以视为一个可读可写没有任何预处理或后处理的属性。而成员变量由于外部不可见,与属性外的特性不相符,所以不能视为属性。在一些表示数据结构数据集合等简单情况下,且不需读写控制等,可以考虑使用成员变量作为属性,这样可以提高一点效率。 Yii基础 属性 property 属性用于表征类的状态,从访问的形式上看,属性与成员变量没有区别。但是,成员变量是就类的结构构成而言的概念,而属性是就...

    instein 评论0 收藏0
  • Yii源码解读-别名

    摘要:设置别名的目的特殊的变量常量保存整个应用的所有别名。别名的解析过程先按根别名找到可能保存别名的分支。别名必然以打头。别名解析时,优先匹配较长的别名。使用别名时,要将别名放在最前面,不能放在中间。 Alias 设置别名的目的:特殊的变量常量 yiiBaseYii::$aliases保存整个Yii应用的所有别名。 在yiiaseApplication的构造函数__construct()中...

    banana_pi 评论0 收藏0
  • Yii源码解读-类自动加载

    摘要:实现的类自动加载,依赖于的,注册一个自己的自动加载函数,并插入到自动加载函数栈的最前面,确保的会被最先调用。首先加载第三方的,再加载的。最后加载的,这样可以保证的优先加载。 实现 Yii的类自动加载,依赖于PHP的spl_autoload_register(), 注册一个自己的自动加载函数(autoloader),并插入到自动加载函数栈的最前面,确保Yii的autoloader会被最先...

    Jeffrrey 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<