2019独角兽企业重金招聘Python工程师标准>>>

闲来无事,想了想PHP如何实现事件监听,参考了jQuery的事件绑定思路,简单的实现了一下。

主要功能:

1.绑定事件 支持一个事件绑定多个动作,支持绑定一次性事件
2.触发事件
3.注销事件

代码如下:

class Event
{ protected static $listens       = array(); 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(); $event                      = array_shift($args); if(!isset(self::$listens[$event])) return false; foreach((array) self::$listens[$event] as $index=>$listen){ $callback               = $listen['callback']; $listen['once'] && self::remove($event, $index); call_user_func_array($callback, $args); } }
}

以下是一些调用的例子:

代码如下:

/ 增加监听walk事件
Event::listen('walk', function(){ echo "I am walking...n";
});
// 增加监听walk一次性事件
Event::listen('walk', function(){ echo "I am listening...n";
}, true);
// 触发walk事件
Event::trigger('walk');
/*
I am walking...
I am listening...
*/
Event::trigger('walk');
/*
I am walking...
*/Event::one('say', function($name=''){ echo "I am {$name}n";
}); Event::trigger('say', 'deeka'); // 输出 I am deeka
Event::trigger('say', 'deeka'); // not run class Foo
{ public function bar(){ echo "Foo::bar() is calledn"; } public function test(){ echo "Foo::foo() is called, agrs:".json_encode(func_get_args())."n"; }
} $foo    = new Foo; Event::listen('bar', array($foo, 'bar'));
Event::trigger('bar'); Event::listen('test', array($foo, 'test'));
Event::trigger('test', 1, 2, 3); class Bar
{ public static function foo(){ echo "Bar::foo() is calledn"; }
} Event::listen('bar1', array('Bar', 'foo'));
Event::trigger('bar1'); Event::listen('bar2', 'Bar::foo');
Event::trigger('bar2'); function bar(){ echo "bar() is calledn";
} Event::listen('bar3', 'bar');
Event::trigger('bar3');

希望本文所述对大家的PHP程序设计有所帮助。

尊重原作者 转载的地址:http://www.bitscn.com/pdb/php/201411/414832.html

转载于:https://my.oschina.net/lambert519/blog/849636

php实现事件监听与触发的方法相关推荐

  1. VRTK之手柄事件监听以及重写StartUsing方法实现与物体的交互

    一.VR开发中经常会用到手柄事件的监听,VRTK中提供了一个例子 VRTK_ControllerEvents_ListenerExample ,首先手柄需要添加VRTK_ControllerEvent ...

  2. JavaScript中绑定事件监听函数的通用方法[ addEvent() ]

    上篇文章讲到了事件绑定的3中常用方法:传统绑定.W3C绑定方法.IE绑定方法.但是,在实际开发中对于我们来讲重要的是需要一个通用的.跨浏览器的绑定方法.如果我们在互联网上搜索一下会发现许多方法,一下是 ...

  3. angular4点击事件监听_JavaScript从零开始——DOM事件编程(1)

    事件的本质是程序各个组成部分之间的一种通信方式,也是异步编程的一种实现.DOM 支持大量的事件,本章开始,我们一起看看 DOM 的事件编程. 1 概念 DOM 的事件操作(监听和触发),都定义在Eve ...

  4. addEventListener() 方法,事件监听

    addEventListener() 方法,事件监听 你可以使用 removeEventListener() 方法来移除事件的监听. 语法 element.addEventListener(event ...

  5. addEventlistener()方法,事件监听

    addEventListener()方法,即为事件监听:可以使用removeEventListener()方法来移除事件的监听. element 可以是 window.document.oDiv 等 ...

  6. 扫盲-----addEventlistener()方法,事件监听(一)

    一.扫盲事件起因 时间:2018年6月1日周五下午,原本我以为我已经把当前的bug改好,应该没啥问题了,坐等下班公司聚餐(开心) 突然,隔壁同组大哥,哎....cp,你看看,你这个首页报了很多错哎.我 ...

  7. 事件监听watch框架vue2.x与3.x都适用

    前言: 目前正在学习vue或者对vue部分使用不太熟悉的可以跟着的我文章,打开编辑器,安装vue-cli一步步的练习,不会安装vue-cli脚手架的小伙伴可以先看这篇文章https://blog.cs ...

  8. 前端如何正确的添加、销毁全局事件监听

    在前端编码中,经常会通过addEventListener来添加全局的事件监听,但是,这种全局的事件监听方法若使用不当,很容易造成严重的性能问题,下面我就来说一下如何正确的添加和销毁全局的事件监听. 添 ...

  9. JavaScript之事件触发on和事件监听addEvent及addEventListener的区别和作用

    一.on事件 为dom节点添加多个on事件只会执行最后的那个事件,因为最后的指定的on事件指向最后的那个函数,代码如下所示: function method1(){console.log('我是方法1 ...

  10. android点击不抬起,Android小坑-OnTouchListener()事件监听长按后抬手MotionEvent.ACTION_MOVE不触发问题...

    场景: 控件使用OnTouchListener()事件监听,正常的流程是,按下瞬间屏幕捕捉到触摸,触发MotionEvent.ACTION_DOWN事件,滑动屏幕会触发MotionEvent.ACTI ...

最新文章

  1. C#零碎知识点笔记(容易混淆的一些点)
  2. python设计模式(十三):解释器模式
  3. [转]深刻理解Python中的元类(metaclass)
  4. 『中级篇』docker之wordpress容器SSL(番外篇)(78)
  5. 公司要禁止QQ?【我们从协议开始分析】
  6. 中点坐标公式 矩形_压轴题必备|中考数学“动点坐标”问题,这个万能解法人人都能学会!...
  7. java资源分配算法,java - 资源分配与动态规划算法 - 堆栈内存溢出
  8. python的print输出_python中的print()输出
  9. 魅族16s Pro细节曝光:骁龙855plus 未上Flyme 8
  10. flink source 同步_Flink面试题
  11. python实用技巧(二)
  12. 统计学习(四):多重检验与控制程序
  13. 「支持m1」自定义菜单键盘快捷键——CustomShortcuts for mac
  14. MySQL常用命令介绍
  15. 充一次电使用一年的手机_手机充一次电用一年?现有技术难实现
  16. 2016中国工程建设项目管理发展大会议程
  17. 使用useSelector、useDispatch替代connect
  18. 最新搜狗泛目录程序,搜狗站群泛目录,搜狗蜘蛛蜘蛛池(图文)
  19. react浏览器兼容报错处理
  20. BZOJ 1812 IOI 2005 riv

热门文章

  1. 华数java 知乎_纠结编程语言的选择?他们为什么都选择了Java?
  2. 系统架构师 项目经理 哪个更有前景_OLED和QLED电视有什么区别?哪个更好更有前景?...
  3. 滁州2021年高考成绩查询时间,安徽2021中考时间表安排 滁州2021年中考时间考点公布...
  4. java传参方式_Java里方法的参数传递方式
  5. python 多进程 阻塞_Python Pool类多进程 apply_async 异步变成了阻塞解决方法
  6. 高淇Struts2.0教程之视频笔记(4)
  7. 【快学springboot】使用springboot发送邮件
  8. 聊聊最近的CPA心得吧
  9. 如何使用JavaScript 结合XSLT转换XML文档
  10. QThread实现多线程