PHP中自定义事件驱动,处理机制。

原文:https://www.cnblogs.com/mafeifan/p/4322271.html

--------------------------------

PHP中的事件处理

看下面的事件类

class Event
{ protected static $listens = array(); /*** [listen 注册监听事件]* @param [string]   $event    [事件名]* @param [callback] $callback [事件内容]* @param [bool] $once [是否是一次性事件,默认false]*/public static function listen($event, $callback, $once=false){ if(!is_callable($callback)) return false; self::$listens[$event][] = array('callback'=>$callback, 'once'=>$once); return true; } // 一次性事件public static function one($event, $callback){ return self::listen($event, $callback, true); } public static function remove($event, $index=null){ if(is_null($index)) unset(self::$listens[$event]); elseunset(self::$listens[$event][$index]); } public static function trigger(){ // 没有参数(传递事件) 退出if(!func_num_args()) return; // 事件名的数组$args  = func_get_args(); // 将函数名(callback)赋给 $event$event = array_shift($args);// 检测事件是否被注册过,没有则退出if(!isset(self::$listens[$event])) return false; foreach( self::$listens[$event] as $index=>$listen){ $callback = $listen['callback']; $listen['once'] && self::remove($event, $index); call_user_func_array($callback, $args); } }
}

这个类包含了事件的注册,触发及移除方法。

下面添加一个事件,事件名叫walk,事件的动作就是输出 "I am walking...n" ,执行后。该事件会存储在 $listens 这个数组中。

Event::listen('walk', function($a='',$b=''){ echo "I am walking...n" .$a .$b;
}); 

触发walk事件

Event::trigger('walk');

也可以传参数进去

Event::trigger('walk','~~~','!!!'); 

如果不移除该事件,触发一次就会执行一次。

而一次性事件执行过一次就会被销毁。再次调用没有任何反应。

Event::one('walkOnce', function(){ echo "run...once";
}); Event::trigger('walkOnce',true);// 因为已经执行过了,再次调用返回了false
Event::trigger('walkOnce');

转载于:https://www.cnblogs.com/oxspirt/p/9515457.html

php中自定义事件---事件驱动相关推荐

  1. 一个不错的讲解flex 3中自定义事件的文章

    一个不错的讲解flex 3中自定义事件的文章 http://wangyisong.javaeye.com/blog/376118,一个不错的讲解flex 3中自定义事件的文章 posted on 20 ...

  2. javascript中自定义事件

    自定义事件:用户可以指定事件类型,这个类型实际上就是一个字符串,然后为这个类型的事件指定事件处理函数,可以注册多个事件处理函数(用数组管理),调用时,从多个事件处理函数中找到再调用. function ...

  3. Flash/Flex学习笔记(34):AS3中的自定义事件

    类似C#中自定义事件需要一个自定义的EventArgs子类一样,AS3也需要开发者自定义一个Event类的子类,这里我们假设一种场景:设计一个Person(人物)类,里面有Age(年龄),Name(姓 ...

  4. Vue学习笔记05 组件的自定义事件-组件通信-$nextTick-脚手架解决ajax跨域-插槽-过渡动画

    文章目录 Vue学习笔记05 父组件给子组件传值 注意点 子组件给父组件传值 父组件接受子组件的传值 通过函数 组件的自定义事件 事件绑定的第一种写法 @或v-on 事件绑定的第二种写法:使用ref ...

  5. Vue 组件间通信方式:自定义事件

    前言 前期分享的测试开发系列!Vue 组件间通信方式汇总,总有一款适合你( 5分钟教程-附项目实战案例 )中介绍了 3 种组件间的通信方法,分别是: props 全局事件总线 消息订阅与发布 今天给大 ...

  6. 如何在JavaScript中使用自定义事件

    2019独角兽企业重金招聘Python工程师标准>>> JavaScript 的事件处理是所有浏览器端程序的基本必备技巧.当目标元素的事件被触发时,比如按钮被点击,鼠标移动,或者是表 ...

  7. 「后端小伙伴来学前端了」关于Vue中的自定义事件,组件绑定自定义事件实现通信

    傍晚的月亮 前言 原本这篇打算写Vue中的那个全局事件总线的原理,但是发现自己少写了这个自定义事件,不讲明白这个自定义事件的操作,不好写全局事件原理,于是就有了这篇文章拉. 一.v-on指令 要讲自定 ...

  8. java 自定义监听_Spring 中的自定义事件

    Spring 中的自定义事件 编写和发布自己的自定义事件有许多步骤.按照在这一章给出的说明来编写,发布和处理自定义 Spring 事件. 步骤 描述 1 创建一个名称为SpringExample的项目 ...

  9. flex中dispatchEvent的用法(自定义事件) .

    Evevt和EventDispatcher类在as3的事件机制中是很重要的角色,dispatchEvent()是EventDispatcher类的一个事件发送方法,它可以发送出Event类或其子类的实 ...

  10. [vue] vue自定义事件中父组件怎么接收子组件的多个参数?

    [vue] vue自定义事件中父组件怎么接收子组件的多个参数? 子组件传递多个参数,父组件用展开运算符获取 个人简介 我是歌谣,欢迎和大家一起交流前后端知识.放弃很容易, 但坚持一定很酷.欢迎大家一起 ...

最新文章

  1. 【问链财经-区块链基础知识系列】 第四十课 港版支付宝的区块链跨境汇款与Ripple、Circle大不同
  2. CVPR 2021 | 破坏方法失效,新框架MagDR让Deepfake稳定难攻
  3. 在 GridView 控件中添加一列复选框51
  4. Generative Adversarial Nets[BEGAN]
  5. python汉字长度_行中字符串的长度(Python)
  6. 关于硬盘运行在不同模式下的疑难解答
  7. VS2010 修改模板文件,增加默认注释
  8. 3.MySQL索引(一)介绍索引
  9. 多种方式创建 Entity Framework Core 上下文
  10. 获取当前位置信息-ios
  11. 考研:无穷小微积分的不适症
  12. 金税盘专、普红字发票开具步骤及(税盘注销方法)
  13. Xcode打包ipa的基本步骤(有证书和无证书)
  14. JavaScript JQuery 交互式Web前端开发
  15. 如何使用REST Assured执行API测试
  16. 人工智能与大数据时代-2020
  17. [198].打家劫舍
  18. canvas 裁剪签名图片 去除多余的空白
  19. RecyclerView实现竖向无限循环滚动的列表
  20. ElementUi中轮播图走马灯如何实现添加图片

热门文章

  1. 原子变量与非阻塞同步机制
  2. jsp用javascript关于浏览器静止后退,刷新
  3. [北航软工]技术规格说明书
  4. 《鸟哥的Linux私房菜》读书笔记
  5. Insert Node in Sorted Linked List
  6. mysqlnd cannot connect to MySQL 4.1+ using the old insecure authentication解决办法
  7. Centos下更新php
  8. 【笔记】gradle命令行运行任务如何设置代理模式
  9. linux子进程知道父进程退出的解决方案
  10. 论文阅读笔记——拥塞控制算法PCC Vivace