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 session 预定义数组
Mar 16 PHP
将文件夹压缩成zip文件的php代码
Dec 14 PHP
PHP程序员面试 切忌急功近利(更需要注重以后的发展)
Sep 01 PHP
解析htaccess伪静态的规则
Jun 18 PHP
保存到桌面、设为桌面且带图标的PHP代码
Nov 19 PHP
PHP中开启gzip压缩的2种方法
Jan 31 PHP
php数组键名技巧小结
Feb 17 PHP
php一个解析字符串排列数组的方法
May 12 PHP
PHP翻页跳转功能实现方法
Nov 30 PHP
thinkPHP自动验证机制详解
Dec 05 PHP
PHP获取中国时间(上海时区时间)及美国时间的方法
Feb 23 PHP
PHP控制反转(IOC)和依赖注入(DI)
Mar 13 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
Banner程序
2006/10/09 PHP
php 函数使用方法与函数定义方法
2010/05/09 PHP
PHP 冒泡排序 二分查找 顺序查找 二维数组排序算法函数的详解
2013/06/25 PHP
PHP连接MySQL的2种方法小结以及防止乱码
2014/03/11 PHP
JavaScript创建命名空间的5种写法
2014/06/24 PHP
PHP四舍五入、取整、round函数使用示例
2015/02/06 PHP
PHP的Yii框架的常用日志操作总结
2015/12/08 PHP
PHP中如何防止外部恶意提交调用ajax接口
2016/04/11 PHP
round robin权重轮循算法php实现代码
2016/05/28 PHP
JS 用6N±1法求素数 实例教程
2009/10/20 Javascript
基于jquery的一个简单的脚本验证插件
2010/04/05 Javascript
JS限制Textarea文本域字符个数的具体实现
2013/08/02 Javascript
jquery提取元素里的纯文本不包含span等里的内容
2013/09/30 Javascript
javascript实用小函数使用介绍
2013/11/11 Javascript
window.open 以post方式传递参数示例代码
2014/02/27 Javascript
jquery中show()、hide()和toggle()用法实例
2015/01/15 Javascript
js正则表达式匹配数字字母下划线等
2015/04/14 Javascript
悬浮广告方法日常收集整理
2016/03/18 Javascript
JavaScript中自带的 reduce()方法使用示例详解
2016/08/10 Javascript
简单实现bootstrap选项卡效果
2017/02/08 Javascript
详解JavaScript中js对象与JSON格式字符串的相互转换
2017/02/14 Javascript
Angular1.x自定义指令实例详解
2017/03/01 Javascript
React+react-dropzone+node.js实现图片上传的示例代码
2017/08/23 Javascript
jq源码解析之绑在$,jQuery上面的方法(实例讲解)
2017/10/13 jQuery
node.js事件轮询机制原理知识点
2019/12/22 Javascript
Python语言的12个基础知识点小结
2014/07/10 Python
python爬取指定微信公众号文章
2018/12/20 Python
Python基础之条件控制操作示例【if语句】
2019/03/23 Python
cProfile Python性能分析工具使用详解
2019/07/22 Python
Python中list的交、并、差集获取方法示例
2019/08/01 Python
Python空间数据处理之GDAL读写遥感图像
2019/08/01 Python
python 在sql语句中使用%s,%d,%f说明
2020/06/06 Python
HTML5之多线程(Web Worker)
2019/01/02 HTML / CSS
戴尔美国官方折扣店:Dell Outlet
2018/02/13 全球购物
生产副总岗位职责
2013/11/28 职场文书
有关三国演义的读书笔记
2015/06/25 职场文书