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中判断一个字符串包含另一个字符串的方法
Mar 19 PHP
收集的PHP中与数组相关的函数
Mar 22 PHP
PHPMyAdmin 快速配置方法
May 11 PHP
PHP中文件缓存转内存缓存的方法
Dec 06 PHP
ThinkPHP中URL路径访问与模块控制器之间的关系
Aug 23 PHP
PHP strtotime函数用法、实现原理和源码分析
Feb 04 PHP
php查看当前Session的ID实例
Mar 16 PHP
php动态绑定变量的用法
Jun 16 PHP
php结合web uploader插件实现分片上传文件
May 10 PHP
ThinkPHP5.1表单令牌Token失效问题的解决
Mar 22 PHP
php设计模式之策略模式应用案例详解
Jun 17 PHP
PHP获取php,mysql,apche的版本信息及更多服务器信息
Mar 09 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中将汉字转换成拼音的函数代码
2012/09/08 PHP
phpmyadmin提示The mbstring extension is missing的解决方法
2014/12/17 PHP
php+ajax实现无刷新动态加载数据技术
2015/04/28 PHP
Windows2003下php5.4安装配置教程(Apache2.4)
2016/06/30 PHP
PHP封装的分页类与简单用法示例
2019/02/25 PHP
jquery中eq和get的区别与使用方法
2011/04/14 Javascript
js选取多个或单个元素的实现代码(用class)
2012/08/22 Javascript
FusionCharts图表显示双Y轴双(多)曲线
2012/11/22 Javascript
jQuery插件开发基础简单介绍
2013/01/07 Javascript
JS实现往下不断流动网页背景的方法
2015/02/27 Javascript
jQuery使用before()和after()在元素前后添加内容的方法
2015/03/26 Javascript
javascript实现网页背景烟花效果的方法
2015/08/06 Javascript
jquery实现简单实用的弹出层效果代码
2015/10/15 Javascript
TypeScript Type Innference(类型判断)
2016/03/10 Javascript
Jquery EasyUI实现treegrid上显示checkbox并取选定值的方法
2016/04/29 Javascript
微信小程序 教程之列表渲染
2016/10/18 Javascript
JS求解三元一次方程组值的方法
2017/01/03 Javascript
jQuery接受后台传递的List的实例详解
2017/08/02 jQuery
JS实现容器模块左右拖动效果
2020/01/14 Javascript
[11:27]《一刀刀一天》之DOTA全时刻20:TI4总奖金突破920W TS赛事分析
2014/06/18 DOTA
[10:21]2018DOTA2国际邀请赛寻真——Winstrike
2018/08/11 DOTA
Python算法之栈(stack)的实现
2014/08/18 Python
Python二叉搜索树与双向链表转换实现方法
2016/04/29 Python
Python解惑之整数比较详解
2017/04/24 Python
详解Python3中的迭代器和生成器及其区别
2018/10/09 Python
详解HTML5 录音的踩坑之旅
2017/12/26 HTML / CSS
amazeui页面分析之登录页面的示例代码
2020/08/25 HTML / CSS
迷你唐卡软皮鞋:Minnetonka Moccasin
2018/05/01 全球购物
.NET初级开发工程师面试题(包括Javascript)
2012/08/22 面试题
const和static readonly区别
2013/05/20 面试题
毕业自我评价
2014/02/05 职场文书
小学课外活动总结
2014/07/09 职场文书
《用字母表示数》教学反思
2016/02/17 职场文书
简单谈谈Python面向对象的相关知识
2021/06/28 Python
理解python中装饰器的作用
2021/07/21 Python
阿里云服务器部署mongodb的详细过程
2021/09/04 MongoDB