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
AMFPHP php远程调用(RPC, Remote Procedure Call)工具 快速入门教程
May 10 PHP
PHP Session_Regenerate_ID函数双释放内存破坏漏洞
Jan 27 PHP
php学习之简单计算器实现代码
Jun 09 PHP
php木马webshell扫描器代码
Jan 25 PHP
php数据库配置文件一般做法分享
Jul 07 PHP
深入php list()函数的详解
Jun 05 PHP
利用PHP函数计算中英文字符串长度的方法
Nov 11 PHP
PHP框架Laravel中实现supervisor执行异步进程的方法
Jun 07 PHP
Joomla框架实现字符串截取的方法示例
Jul 18 PHP
TP5框架实现的数据库备份功能示例
Apr 05 PHP
php 解析非标准json、非规范json
Apr 01 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_Flame(Version:Progress)的原代码
2006/10/09 PHP
获取用户Ip地址通用方法与常见安全隐患(HTTP_X_FORWARDED_FOR)
2013/06/01 PHP
浅析Yii2缓存的使用
2016/05/10 PHP
php rsa 加密,解密,签名,验签详解
2016/12/06 PHP
jQuery textarea的长度进行验证
2009/05/06 Javascript
jquery focus(fn),blur(fn)方法实例代码
2011/12/16 Javascript
jQuery之选择组件的深入解析
2013/06/19 Javascript
JS实现下拉菜单赋值到文本框的方法
2015/08/18 Javascript
js实现点击获取验证码倒计时效果
2021/01/28 Javascript
AngularJS 使用$sce控制代码安全检查
2016/01/05 Javascript
javascript类型系统 Window对象学习笔记
2016/01/07 Javascript
理解JavaScript事件对象
2016/01/25 Javascript
JavaScript学习小结之被嫌弃的eval函数和with语句实例详解
2016/08/01 Javascript
vue.js学习笔记之绑定style样式和class列表
2016/10/31 Javascript
12306 刷票脚本及稳固刷票脚本(防挂)
2017/01/04 Javascript
BootStrap Datepicker 插件修改为默认中文的实现方法
2017/02/10 Javascript
JS开发中百度地图+城市联动实现实时触发查询地址功能
2017/04/13 Javascript
vue-rx的初步使用教程
2018/09/21 Javascript
Bootstrap4 gulp 配置详解
2019/01/06 Javascript
JS重学系列之聊聊new操作符
2019/03/04 Javascript
小程序实现短信登录倒计时
2019/07/12 Javascript
Python 数据结构之旋转链表
2017/02/25 Python
Python简单获取二维数组行列数的方法示例
2018/12/21 Python
Pyinstaller打包.py生成.exe的方法和报错总结
2019/04/02 Python
通过Python扫描代码关键字并进行预警的实现方法
2020/05/24 Python
基于python实现matlab filter函数过程详解
2020/06/08 Python
爱游人:Travelliker
2017/09/05 全球购物
货代行业个人求职简历的自我评价
2013/10/22 职场文书
中英文求职信范文
2014/01/27 职场文书
幼儿园中班评语大全
2014/04/17 职场文书
幼儿园教师演讲稿
2014/05/06 职场文书
我爱幼儿园演讲稿
2014/09/11 职场文书
javascript canvas实现雨滴效果
2021/06/09 Javascript
浅析Python中的套接字编程
2021/06/22 Python
MySQL磁盘碎片整理实例演示
2022/04/03 MySQL
阿里云服务器(windows)手动部署FTP站点详细教程
2022/08/05 Servers