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 相关文章推荐
定制404错误页面,并发信给管理员的程序
Oct 09 PHP
php读取excel文件的简单实例
Aug 26 PHP
php中的四舍五入函数代码(floor函数、ceil函数、round与intval)
Jul 14 PHP
php防止站外远程提交表单的方法
Oct 20 PHP
php根据某字段对多维数组进行排序的方法
Mar 07 PHP
通过Email发送PHP错误的方法
Jul 20 PHP
分享PHP函数实现数字与文字分页代码
Jul 28 PHP
php实现无限级分类(递归方法)
Aug 06 PHP
Laravel 5.4.36中session没有保存成功问题的解决
Feb 19 PHP
Laravel 实现添加多语言提示信息
Oct 25 PHP
Laravel如何实现适合Api的异常处理响应格式
Jun 14 PHP
PHP中->和=>的意思
Mar 31 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
20个PHP常用类库小结
2011/09/11 PHP
如何用PHP来实现一个动态Web服务器
2015/07/29 PHP
php读取本地json文件的实例
2018/03/07 PHP
php报错502badgateway解决方法
2019/10/11 PHP
你真的了解JavaScript吗?
2007/02/24 Javascript
IE与FireFox的兼容性问题分析
2007/04/22 Javascript
javascript 可以拖动的DIV(二)
2009/06/26 Javascript
javascript中普通函数的使用介绍
2013/12/19 Javascript
jQuery中:selected选择器用法实例
2015/01/04 Javascript
JavaScript判断一个字符串是否包含指定子字符串的方法
2015/03/18 Javascript
jQuery解析XML文件同时动态增加js文件的方法
2015/06/01 Javascript
jQuery实现div横向拖拽排序的简单实例
2016/07/13 Javascript
vue.js整合mint-ui里的轮播图实例代码
2017/12/27 Javascript
JS实现匀速与减速缓慢运动的动画效果封装示例
2018/08/27 Javascript
Vue $mount实战之实现消息弹窗组件
2019/04/22 Javascript
Vue 使用beforeEach实现登录状态检查功能
2019/10/31 Javascript
[41:08]TNC vs VG 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
浅析python 内置字符串处理函数的使用方法
2014/06/11 Python
巧用python和libnmapd,提取Nmap扫描结果
2016/08/23 Python
Python结合ImageMagick实现多张图片合并为一个pdf文件的方法
2018/04/24 Python
python3 实现验证码图片切割的方法
2018/12/07 Python
详解python算法之冒泡排序
2019/03/05 Python
Django urls.py重构及参数传递详解
2019/07/23 Python
Django框架 querySet功能解析
2019/09/04 Python
Django实现图片上传功能步骤解析
2020/04/22 Python
PyCharm2019 安装和配置教程详解附激活码
2020/07/31 Python
酒店总经理助理职责
2014/02/12 职场文书
公司成本主管岗位责任制
2014/02/21 职场文书
办理信用卡收入证明范例
2014/09/13 职场文书
办公室主任个人对照检查材料思想汇报
2014/10/11 职场文书
民主生活会批评与自我批评总结
2014/10/17 职场文书
升职自荐信怎么写
2015/03/05 职场文书
学校远程教育工作总结
2015/08/11 职场文书
如何获取numpy array前N个最大值
2021/05/14 Python
据Python爬虫不靠谱预测可知今年双十一销售额将超过6000亿元
2021/11/11 Python
一条 SQL 语句执行过程
2022/03/17 MySQL