php实现监听事件


Posted in PHP onNovember 06, 2013

如何实现事件监听,参考了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实现验证码功能
Oct 09 PHP
php5新改动之短标记启用方法
Sep 11 PHP
php ftp文件上传函数(基础版)
Jun 03 PHP
解析PHP将对象转换成数组的方法(兼容多维数组类型)
Jun 21 PHP
php中并发读写文件冲突的解决方案
Oct 25 PHP
destoon会员注册提示“数据校验失败(2)”解决方法
Jun 21 PHP
PHP错误处理函数
Apr 03 PHP
关于php中一些字符串总结
May 05 PHP
PHP树-不需要递归的实现方法
Jun 21 PHP
php实现的redis缓存类定义与使用方法示例
Aug 09 PHP
yii框架结合charjs实现统计30天数据的方法
Apr 04 PHP
PHP使用QR Code生成二维码实例
Jul 07 PHP
php生成扇形比例图实例
Nov 06 #PHP
php多用户读写文件冲突的解决办法
Nov 06 #PHP
php生成图形(Libchart)实例
Nov 06 #PHP
php ZipArchive压缩函数详解实例
Nov 06 #PHP
php根据分类合并数组的方法实例详解
Nov 06 #PHP
php foreach循环中使用引用的问题
Nov 06 #PHP
php用正则表达式匹配中文实例详解
Nov 06 #PHP
You might like
初识php MVC
2014/09/10 PHP
完整删除ecshop中获取店铺信息的API
2014/12/24 PHP
PHP数组相加操作及与array_merge的区别浅析
2016/11/26 PHP
php获取POST数据的三种方法实例详解
2016/12/20 PHP
Laravel接收前端ajax传来的数据的实例代码
2017/07/20 PHP
JQuery 自定义CircleAnimation,Animate方法学习笔记
2011/07/10 Javascript
js获取当前地址 JS获取当前URL的示例代码
2014/02/26 Javascript
jQuery动画特效实例教程
2014/08/29 Javascript
JavaScript学习笔记之创建对象
2016/03/25 Javascript
Javascript基础之数组的使用
2016/05/13 Javascript
JavaScript ES6的新特性使用新方法定义Class
2016/06/28 Javascript
关于javascript原型的修改与重写(覆盖)差别详解
2016/08/31 Javascript
BootstrapValidator超详细教程(推荐)
2016/12/07 Javascript
jquery仿微信聊天界面
2017/05/06 jQuery
Ionic + Angular.js实现图片轮播的方法示例
2017/05/21 Javascript
weui框架实现上传、预览和删除图片功能代码
2017/08/24 Javascript
js导出Excel表格超出26位英文字符的解决方法ES6
2017/11/15 Javascript
浅谈super-vuex使用体验
2018/06/25 Javascript
countUp.js实现数字动态变化效果
2019/10/17 Javascript
Python读取txt某几列绘图的方法
2018/10/14 Python
在PyCharm下使用 ipython 交互式编程的方法
2019/01/17 Python
Python中zip()函数的简单用法举例
2019/09/02 Python
Python hmac模块使用实例解析
2019/12/24 Python
Pytorch之保存读取模型实例
2019/12/30 Python
pytorch下使用LSTM神经网络写诗实例
2020/01/14 Python
Python多进程multiprocessing、进程池用法实例分析
2020/03/24 Python
Pytorch 扩展Tensor维度、压缩Tensor维度的方法
2020/09/09 Python
HTML5响应式(自适应)网页设计的实现
2017/11/17 HTML / CSS
在对linux系统分区进行格式化时需要对磁盘簇(或i节点密度)的大小进行选择,请说明选择的原则
2012/01/13 面试题
什么是ESB?请介绍一下ESB?
2015/05/27 面试题
专业毕业生个性的自我评价
2013/10/03 职场文书
校运会广播稿100字
2014/01/27 职场文书
销售活动策划方案
2014/08/26 职场文书
高中军训的心得体会
2014/09/01 职场文书
在酒桌上的敬酒词
2015/08/12 职场文书
Nginx安装完成没有生成sbin目录的解决方法
2021/03/31 Servers