位置: 编程技术 - 正文

深入解析PHP的Yii框架中的event事件机制(php解析配置文件)

编辑:rootadmin

推荐整理分享深入解析PHP的Yii框架中的event事件机制(php解析配置文件),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:php解析原理,php 解释器,php解析接口,php的了解,php的了解,php解析原理,php解析接口,php 解析,内容如对您有帮助,希望把文章链接给更多的朋友!

事件事件可以将自定义代码“注入”到现有代码中的特定执行点。附加自定义代码到某个事件,当这个事件被触发时,这些代码就会自动执行。例如,邮件程序对象成功发出消息时可触发 messageSent 事件。如想追踪成功发送的消息,可以附加相应追踪代码到messageSent 事件。Yii 引入了名为 yiibaseComponent 的基类以支持事件。如果一个类需要触发事件就应该继承 yiibaseComponent 或其子类。

Yii的event机制YII的事件机制,是其比较独特之处,合理使用好事件机制,会使各个组件之间的耦合更为松散,利于团体协作开发。何时需要使用事件,如何给事件绑定事件处理函数,以及如何触发事件,与其它语言是有较大的差别的。例如Javascript中,可以使用

方式给DOM元素绑定处理函数,当DOM元素上发生指定的事件(如click)时,将自动执行设定的函数。 但是PHP是服务器端的脚本语言,就不存在自动触发事件之说,所以和Javascript对比,YII中的事件是需要手动触发的。一般来说,要实现YII组件的事件机制,需要以下几步:

定义事件名称,其实就是级组件定义一个on开头的方法,其中的代码是固定的,如:

即函数名与事件名是一致的。此步的作用就是将绑定在此事件上的处理函数逐个执行。写这一系列的播客,算是一个整理,所以我写细一点,现在把raiseEvent方法的代码贴出来。

事件处理器(Event Handlers)

事件处理器是一个PHP 回调函数,当它所附加到的事件被触发时它就会执行。可以使用以下回调函数之一:

字符串形式指定的 PHP 全局函数,如 'trim' ; 对象名和方法名数组形式指定的对象方法,如 [$object, $method] ; 类名和方法名数组形式指定的静态类方法,如 [$class, $method] ; 匿名函数,如 function ($event) { ... } 。

事件处理器的格式是:

通过 $event 参数,事件处理器就获得了以下有关事件的信息:

yiibaseEvent::name:事件名 yiibaseEvent::sender:调用 trigger() 方法的对象 yiibaseEvent::data:附加事件处理器时传入的数据,默认为空,后文详述

附加事件处理器

调用 yiibaseComponent::on() 方法来附加处理器到事件上。如:

事件处理器顺序

可以附加一个或多个处理器到一个事件。当事件被触发,已附加的处理器将按附加次序依次调用。如果某个处理器需要停止其后的处理器调用,可以设置 $event 参数的 [yiibaseEvent::handled]] 属性为真,如下:

默认新附加的事件处理器排在已存在处理器队列的最后。因此,这个处理器将在事件被触发时最后一个调用。在处理器队列最前面插入新处理器将使该处理器最先调用,可以传递第四个参数 $append 为假并调用 yiibaseComponent::on() 方法实现:

触发事件

事件通过调用 yiibaseComponent::trigger() 方法触发,此方法须传递事件名,还可以传递一个事件对象,用来传递参数到事件处理器。如:

以上代码当调用 bar() ,它将触发名为 hello 的事件。

提示:推荐使用类常量来表示事件名。上例中,常量 EVENT_HELLO 用来表示 hello 。这有两个好处。第一,它可以防止拼写错误并支持 IDE 的自动完成。第二,只要简单检查常量声明就能了解一个类支持哪些事件。有时想要在触发事件时同时传递一些额外信息到事件处理器。例如,邮件程序要传递消息信息到 messageSent 事件的处理器以便处理器了解哪些消息被发送了。为此,可以提供一个事件对象作为 yiibaseComponent::trigger() 方法的第二个参数。这个事件对象必须是 yiibaseEvent 类或其子类的实例。如:

当 yiibaseComponent::trigger() 方法被调用时,它将调用所有附加到命名事件(trigger 方法第一个参数)的事件处理器。

移除事件处理器

从事件移除处理器,调用 yiibaseComponent::off() 方法。如:

注意当匿名函数附加到事件后一般不要尝试移除匿名函数,除非你在某处存储了它。以上示例中,假设匿名函数存储为变量$anonymousFunction 。

移除事件的全部处理器,简单调用 yiibaseComponent::off() 即可,不需要第二个参数:

深入解析PHP的Yii框架中的event事件机制(php解析配置文件)

类级别的事件处理器

以上部分,我们叙述了在实例级别如何附加处理器到事件。有时想要一个类的所有实例而不是一个指定的实例都响应一个被触发的事件,并不是一个个附加事件处理器到每个实例,而是通过调用静态方法 yiibaseEvent::on() 在类级别附加处理器。

例如,活动记录对象要在每次往数据库新增一条新记录时触发一个 yiidbBaseActiveRecord::EVENT_AFTER_INSERT 事件。要追踪每个活动记录对象的新增记录完成情况,应如下写代码:

每当 yiidbBaseActiveRecord 或其子类的实例触发 yiidbBaseActiveRecord::EVENT_AFTER_INSERT 事件时,这个事件处理器都会执行。在这个处理器中,可以通过 $event->sender 获取触发事件的对象。

当对象触发事件时,它首先调用实例级别的处理器,然后才会调用类级别处理器。

可调用静态方法yiibaseEvent::trigger()来触发一个类级别事件。类级别事件不与特定对象相关联。因此,它只会引起类级别事件处理器的调用。如:

注意这种情况下 $event->sender 指向触发事件的类名而不是对象实例。

注意:因为类级别的处理器响应类和其子类的所有实例触发的事件,必须谨慎使用,尤其是底层的基类,如 yiibaseObject。移除类级别的事件处理器只需调用yiibaseEvent::off(),如:

全局事件

所谓全局事件实际上是一个基于以上叙述的事件机制的戏法。它需要一个全局可访问的单例,如应用实例。

事件触发者不调用其自身的 trigger() 方法,而是调用单例的 trigger() 方法来触发全局事件。类似地,事件处理器被附加到单例的事件。如:

全局事件的一个好处是当附加处理器到一个对象要触发的事件时,不需要产生该对象。相反,处理器附加和事件触发都通过单例(如应用实例)完成。

然而,因为全局事件的命名空间由各方共享,应合理命名全局事件,如引入一些命名空间(例:"frontend.mail.sent", "backend.mail.sent")。

给组件对象绑定事件处理函数

yii支持一个事件绑定多个回调函数,上述的两个方法都会在已有的事件上增加新的回调函数,而不会覆盖已有回调函数。$handler即是一个PHP回调函数,关于回调函数的形式,本文的最后会附带说明。如CLogRouter组件的init事件中,有以下代码:

这就是给CApplication对象的onEndRequest绑定了CLogRouter::processLogs()回调函数。而CApplication组件确实存在名为onEndRequest的方法(即onEndRequest事件),它之中的代码就是激活了相应的回调函数,即CLogRouter::processLogs()方法。所以从这里可以得出,日志的记录其实是发生在CApplication组件的正常退出时。

在需要触发事件的时候,直接激活组件的事件,即调用事件即可,如:比如CApplication组件的run方法中:

这样即触发了事件处理函数。如果没有第一行的判断,那么在调试模式下(YII_DEBUG常量被定义为true),会抛出异常,而在非调试模式下(YII_DEBUG常量定义为false或没有定义YII_DEBUG常量),则不会产生任何异常。回调函数的形式:

普通全局函数(内置的或用户自定义的)

类的静态方法,使用数组形式传递

对象方法,使用数组形式传递

匿名方法,类似javascript的匿名函数

或使用以下形式:

总结

关于Yii的事件机制其实就是提供了一种用于解耦的方式,在需要调用event的地方之前,只要你提供了事件的实现并注册在之后的地方需要的时候即可调用。

详解PHP的Yii框架的运行机制及其路由功能 运行机制概述每一次Yii应用开始处理HTTP请求时,它都会进行一个近似的流程。用户提交指向入口脚本web/index.php的请求。入口脚本会加载配置数组并创建

PHP的Yii框架中YiiBase入口类的扩展写法示例 通过yiic.php自动创建一个应用后,入口文件初始代码如下:php//changethefollowingpathsifnecessary$yii=dirname(__FILE__).'/../yii/framework/yii.php';$config=dirname(__FILE__).'/prote

简要剖析PHP的Yii框架的组件化机制的基本知识 组件是Yii应用的主要基石。是yiibaseComponent类或其子类的实例。三个用以区分它和其它类的主要功能有:属性(Property)事件(Event)行为(Behavior)或

标签: php解析配置文件

本文链接地址:https://www.jiuchutong.com/biancheng/292462.html 转载请保留说明!

上一篇:全面解读PHP的Yii框架中的日志功能(php的了解)

下一篇:详解PHP的Yii框架的运行机制及其路由功能(php的框架有哪些)

  • 劳务公司发放农民工工资要开发票吗?
  • 公司代缴个人所得税做账
  • 发票隔月作废怎么操作
  • 公账转法人私账的注意事项
  • 期间损益结转错误怎么冲销
  • 小规模一直零申报也要工商申报吗?
  • 一般纳税人厂房出租怎么开票
  • 企业会计核算基础
  • 股息和资本利得的区别
  • 建筑行业未收款先开发票如何做账?
  • 购税控盘账务处理
  • 开办费所得税清缴时如何调整
  • 发票先收到下个月才付款
  • 缴纳印花税需要计提吗?
  • 非独立核算的分公司如何报税
  • 生产企业开具加工费发票的问题
  • 企业自有固定资产有哪些
  • 增值税税差调整原因
  • 住房公积金是否全国联网
  • 房产中介如何收取中介费
  • 去国外参加展会带什么东西
  • word如何修改正文字体
  • 股票退市后股票怎么处理
  • 微信提现手续费最新规定
  • 企业增值税征收范围包括
  • 无法登陆wifi怎么登陆路由器
  • 艾草的功效与作用洗头
  • php 调试工具
  • 堡垒封印
  • 公司给员工付个税怎么算
  • php 收邮件
  • yolo系列算法比较
  • php二分查找算法两种方法
  • 当月开出的销项票一定要当月抵扣吗
  • 个税申报密码重置多久能用
  • 设备调试费是什么税
  • 公司认缴的钱可以动吗
  • 无形资产商标设计图片
  • 顺丰的电子发票是不是只有收到以后能开
  • 怎么填红字信息表
  • 金蝶余额调节表勾对日期什么意思
  • 企业购房如何入账
  • 物业费可税前扣除吗
  • 核定征收企业盈利怎么算
  • 股东权益合计等于净资产吗
  • 一年内到期的非流动负债计算公式
  • 业务招待费可以开专票抵扣吗
  • 多计提的收入怎么冲回
  • 工会经费能零申报保存不起
  • 长期股权投资属于什么会计要素
  • sqlserver数据库测试工具
  • sql语句实例大全
  • windows任务管理器怎么打开
  • win8系统怎么设置无线网连接啊
  • win2003开机蓝屏
  • 解析包出现错误无法安装怎么办
  • ubuntu 操作系统
  • linux如何查询
  • hkcmd.exe损坏文件
  • 注册表干嘛用
  • linux系统中安装web服务
  • win10如何删除右键菜单选项
  • linux怎么切到桌面
  • win10注册表的作用
  • linux7.2 sudo权限配置
  • 更改mac地址值
  • pcn是什么软件
  • 苹果win10更新48%不动了
  • JS写XSS cookie stealer来窃取密码的步骤详解
  • css颜色值正确的表达形式
  • nodejs+ts
  • 读取带敏感字符的行的批处理
  • js有几种模式
  • jQuery UI结合Ajax创建可定制的Web界面
  • 地税税务稽查管理办法
  • 苏州相城离苏州市区有多远
  • 买二手房土地证怎么过户
  • 成都车辆购置税2024年新政策
  • 河北地税网上申报纳税
  • 个人的车租给公司保险可以入账吗
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设