php实现事件监听与触发的方法


Posted in PHP onNovember 21, 2014

本文实例讲述了php实现事件监听与触发的方法。分享给大家供大家参考。具体分析如下:

闲来无事,想了想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]); 

        else

            unset(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程序设计有所帮助。

PHP 相关文章推荐
延长phpmyadmin登录时间的方法
Feb 06 PHP
深入php多态的实现详解
Jun 09 PHP
自己写的兼容低于PHP 5.5版本的array_column()函数
Oct 24 PHP
php实现简单的语法高亮函数实例分析
Apr 27 PHP
再Docker中架设完整的WordPress站点全攻略
Jul 29 PHP
深入浅析php json 格式控制
Dec 24 PHP
PHP针对多用户实现更换头像功能
Sep 04 PHP
PHP实现文件下载【实例分享】
Apr 28 PHP
PHP创建文件及写入数据(覆盖写入,追加写入)的方法详解
Feb 15 PHP
PHP5.5基于mysqli连接MySQL数据库和读取数据操作实例详解
Feb 16 PHP
thinkphp5.1框架模板布局与模板继承用法分析
Jul 19 PHP
php实现的生成排列算法示例
Jul 25 PHP
PHP通过内置函数memory_get_usage()获取内存使用情况
Nov 20 #PHP
IIS下PHP的三种配置方式对比
Nov 20 #PHP
PHP程序员常见的40个陋习,你中了几个?
Nov 20 #PHP
php目录遍历函数opendir用法实例
Nov 20 #PHP
php中base_convert()进制数字转换函数实例
Nov 20 #PHP
PHP PDOStatement对象bindpram()、bindvalue()和bindcolumn之间的区别
Nov 20 #PHP
PDO预处理语句PDOStatement对象使用总结
Nov 20 #PHP
You might like
PHP最常用的2种设计模式工厂模式和单例模式介绍
2012/08/14 PHP
Windows下安装PHP单元测试环境PHPUnit图文教程
2014/10/24 PHP
PHP GD库生成图像的几个函数总结
2014/11/19 PHP
PHP微信分享开发详解
2017/01/14 PHP
Nigma vs Alliance BO5 第一场2.14
2021/03/10 DOTA
类似框架的js代码
2006/11/09 Javascript
高效的表格行背景隔行变色及选定高亮的JS代码
2010/12/04 Javascript
setInterval,setTimeout与jquery混用的问题
2013/04/08 Javascript
JS文本获得焦点清除文本文字的示例代码
2014/01/13 Javascript
JavaScript设计模式之装饰者模式介绍
2014/12/28 Javascript
javascript实现避免页面按钮重复提交
2015/01/08 Javascript
jQuery实现的向下图文信息滚动效果
2015/05/03 Javascript
JavaScrip调试技巧之断点调试
2015/10/22 Javascript
JavaScript判断表单为空及获取焦点的方法
2016/02/12 Javascript
JavaScript事件学习小结(三)js事件对象
2016/06/09 Javascript
输入法的回车与消息发送快捷键回车的冲突解决方法
2016/08/09 Javascript
js设置和获取自定义属性的方法
2016/10/20 Javascript
浅谈js键盘事件全面控制
2016/12/01 Javascript
详解nodejs 文本操作模块-fs模块(二)
2016/12/22 NodeJs
Bootstrap3 多个模态对话框无法显示的解决方案
2017/02/23 Javascript
使用openSpeDiv方法实现Ecshop登录弹窗框效果
2017/03/13 Javascript
微信小程序--onShareAppMessage分享参数用处(页面分享)
2017/04/18 Javascript
H5手机端多文件上传预览插件
2017/04/21 Javascript
Vue中计算属性computed的示例解读
2017/07/26 Javascript
关于react-router/react-router-dom v4 history不能访问问题的解决
2018/01/08 Javascript
JavaScript 跨域之POST实现方法
2018/05/07 Javascript
值得收藏的八个常用的js正则表达式
2018/10/19 Javascript
js中switch语句的学习笔记
2020/03/25 Javascript
Python OpenCV实现鼠标画框效果
2020/08/19 Python
基于Python的身份证验证识别和数据处理详解
2020/11/14 Python
Hotels.com南非:酒店预订
2017/11/02 全球购物
档案管理员岗位职责
2013/12/01 职场文书
学生通报表扬范文
2015/05/04 职场文书
《游戏公平》教学反思
2016/02/20 职场文书
六年级作文之自救
2019/12/19 职场文书
Vue3.0 手写放大镜效果
2021/07/25 Vue.js