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 相关文章推荐
综合图片计数器
Oct 09 PHP
php绝对路径与相对路径之间关系的的分析
Mar 03 PHP
用PHP实现读取和编写XML DOM代码
Apr 07 PHP
腾讯QQ php程序员面试题目整理
Jun 08 PHP
smarty半小时快速上手入门教程
Oct 27 PHP
Laravel 4.2 中队列服务(queue)使用感受
Oct 30 PHP
php中get_cfg_var()和ini_get()的用法及区别
Mar 04 PHP
php获得文件大小和文件创建时间的方法
Mar 13 PHP
php实现格式化多行文本为Js可用格式
Apr 15 PHP
php如何控制用户对图片的访问 PHP禁止图片盗链
Mar 25 PHP
PHP请求Socket接口测试实例
Aug 12 PHP
php删除一个路径下的所有文件夹和文件的方法
Feb 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简单对象与数组的转换函数代码(php多层数组和对象的转换)
2011/05/18 PHP
php将时间差转换为字符串提示
2011/09/07 PHP
真正根据utf8编码的规律来进行截取字符串的函数(utf8版sub_str )
2012/10/24 PHP
使用php清除bom示例
2014/03/03 PHP
composer.lock文件的作用
2016/02/03 PHP
php实现生成验证码实例分享
2016/04/10 PHP
PHP读书笔记_运算符详解
2016/07/01 PHP
PHP实现的敏感词过滤方法示例
2019/03/06 PHP
Laravel timestamps 设置为unix时间戳的方法
2019/10/11 PHP
SeaJS入门教程系列之SeaJS介绍(一)
2014/03/03 Javascript
javascript判断是否按回车键并解决浏览器之间的差异
2014/05/13 Javascript
JS+CSS实现表格高亮的方法
2015/08/05 Javascript
JavaScript模拟鼠标右键菜单效果
2020/12/08 Javascript
JS中sort函数排序用法实例分析
2016/06/16 Javascript
javascript字符串对象常用api函数小结(连接,替换,分割,转换等)
2016/09/20 Javascript
Openlayers测量距离与面积的实现方法
2020/09/25 Javascript
[47:22]Mineski vs Winstrike 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
Python学习之Django的管理界面代码示例
2018/02/10 Python
python调用matlab的m自定义函数方法
2019/02/18 Python
python按比例随机切分数据的实现
2019/07/11 Python
python 初始化一个定长的数组实例
2019/12/02 Python
python如何进行矩阵运算
2020/06/05 Python
解决Pycharm双击图标启动不了的问题(JetBrains全家桶通用)
2020/08/07 Python
STAY JAPAN台湾:预订日本民宿
2018/07/22 全球购物
在阿联酋购买翻新手机和平板电脑:Teckzu
2021/02/12 全球购物
通用C#笔试题附答案
2016/11/26 面试题
周鸿祎:教你写创业计划书
2013/12/30 职场文书
销售心得体会
2014/01/02 职场文书
小学教师暑期培训方案
2014/08/28 职场文书
2014教师年度工作总结
2014/11/10 职场文书
村干部任职承诺书
2015/01/21 职场文书
经理助理岗位职责
2015/02/02 职场文书
2015安全保卫工作总结
2015/04/25 职场文书
电影建党伟业观后感
2015/06/01 职场文书
2019最新公司租房合同(例文)
2019/07/18 职场文书
linux中nohup和后台运行进程查看及终止
2021/06/24 Python