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 相关文章推荐
discuz7 phpMysql操作类
Jun 21 PHP
基于MySQL分区性能的详细介绍
May 02 PHP
PHP多线程批量采集下载美女图片的实现代码(续)
Jun 03 PHP
关于file_get_contents返回为空或函数不可用的解决方案
Jun 24 PHP
php事务处理实例详解
Jul 11 PHP
PHP防止表单重复提交的几种常用方法汇总
Aug 19 PHP
必须收藏的23个php实用代码片段
Feb 02 PHP
记录一次排查PHP脚本执行卡住的问题
Dec 27 PHP
浅谈PHP中的错误处理和异常处理
Feb 04 PHP
PHP的中使用非缓冲模式查询数据库的方法
Feb 05 PHP
PHP使用glob方法遍历文件夹下所有文件的实例
Oct 17 PHP
PHP重载基础知识回顾
Sep 10 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新手上路(十二)
2006/10/09 PHP
用mysql_fetch_array()获取当前行数据的方法详解
2013/06/05 PHP
php获取远程文件的内容和大小
2015/11/03 PHP
php is_writable判断文件是否可写实例代码
2016/10/13 PHP
PHP命名空间定义与用法实例分析
2019/08/14 PHP
让textarea控件的滚动条怎是位与最下方
2007/04/20 Javascript
Jquery遍历节点的方法小集
2014/01/22 Javascript
js操作滚动条事件实例
2015/01/29 Javascript
nodejs简单实现中英文翻译
2015/05/04 NodeJs
深入浅析Node环境和浏览器的区别
2018/08/14 Javascript
JavaScript键盘事件常见用法实例分析
2019/01/03 Javascript
Vue select 绑定动态变量的实例讲解
2020/10/22 Javascript
python实现判断数组是否包含指定元素的方法
2015/07/15 Python
Python实现返回数组中第i小元素的方法示例
2017/12/04 Python
python 时间信息“2018-02-04 18:23:35“ 解析成字典形式的结果代码详解
2018/04/19 Python
Python实现的简单线性回归算法实例分析
2018/12/26 Python
Python神奇的内置函数locals的实例讲解
2019/02/22 Python
用python生成(动态彩色)二维码的方法(使用myqr库实现)
2019/06/24 Python
Python利用神经网络解决非线性回归问题实例详解
2019/07/19 Python
Python爬虫设置ip代理过程解析
2020/07/20 Python
如何Tkinter模块编写Python图形界面
2020/10/14 Python
使用Python爬取Json数据的示例代码
2020/12/07 Python
html5 自定义播放器核心代码
2013/12/20 HTML / CSS
澳大利亚领先的在线美容商城:Adore Beauty
2017/04/14 全球购物
全球知名的珠宝首饰品牌:Kay Jewelers
2018/02/11 全球购物
历史系自荐信范文
2013/12/24 职场文书
古汉语文学求职信范文
2014/03/16 职场文书
材料专业大学毕业生自荐书
2014/07/02 职场文书
房屋维修协议书范本
2014/09/25 职场文书
生日赠语
2015/06/23 职场文书
公司员工管理制度
2015/08/04 职场文书
导游词之山西-五老峰
2019/10/07 职场文书
Pytest中skip和skipif的具体使用方法
2021/06/30 Python
解决Swagger2返回map复杂结构不能解析的问题
2021/07/02 Java/Android
nginx请求限制配置方法
2021/07/09 Servers
Winsows11性能如何? win11性能测评多核竟比Win10差了10%
2021/11/21 数码科技