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 相关文章推荐
通过JavaScript或PHP检测Android设备的代码
Mar 09 PHP
PHP图片等比缩放类SimpleImage使用方法和使用实例分享
Apr 10 PHP
PHP生成等比缩略图类和自定义函数分享
Jun 25 PHP
PHP中使用Memache作为进程锁的操作类分享
Mar 30 PHP
PHP封装的字符串加密解密函数
Dec 18 PHP
PHP模板引擎Smarty内置变量调解器用法详解
Apr 11 PHP
php 访问oracle 存储过程实例详解
Jan 08 PHP
详谈PHP中的密码安全性Password Hashing
Feb 04 PHP
PHP实现的简单对称加密与解密方法实例小结
Aug 28 PHP
PDO::prepare讲解
Jan 29 PHP
Yii 框架使用Forms操作详解
May 18 PHP
PHP Ajax跨域问题解决方案代码实例
Aug 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
信用卡效验程序
2006/10/09 PHP
PHP版QQ互联OAuth示例代码分享
2015/07/05 PHP
PHP发送短信代码分享
2015/08/11 PHP
使用PHP下载CSS文件中的所有图片【几行代码即可实现】
2016/12/14 PHP
laravel5.5安装jwt-auth 生成token令牌的示例
2019/10/24 PHP
PHP重载基础知识回顾
2020/09/10 PHP
用jQuery简化JavaScript开发分析
2009/02/19 Javascript
JQuery autocomplete 使用手册
2010/04/01 Javascript
javascript 获取函数形参个数
2014/07/31 Javascript
JavaScript实现动态创建CSS样式规则方案
2014/09/06 Javascript
javascript制作sql转换为stringBuffer的小工具
2015/04/03 Javascript
jquery中map函数遍历数组用法实例
2015/05/18 Javascript
jQuery插件expander实现图片翻转特效
2015/05/21 Javascript
详解JavaScript基于面向对象之继承实例
2015/12/16 Javascript
bootstrap选项卡使用方法解析
2017/01/11 Javascript
BootStrap表单控件之文本域textarea
2017/05/23 Javascript
Python中函数的多种格式和使用实例及小技巧
2015/04/13 Python
Python3实现从文件中读取指定行的方法
2015/05/22 Python
python3使用PyMysql连接mysql数据库实例
2017/02/07 Python
Python爬取qq music中的音乐url及批量下载
2017/03/23 Python
Python2实现的LED大数字显示效果示例
2017/09/04 Python
python绘制圆柱体的方法
2018/07/02 Python
python flask安装和命令详解
2019/04/02 Python
用python实现学生管理系统
2020/07/24 Python
迪斯尼商品官方网站:ShopDisney
2016/08/01 全球购物
LA MER海蓝之谜美国官网:传奇面霜
2016/08/27 全球购物
墨西哥巴士车票在线购买:ClickBus
2018/03/27 全球购物
纽约州一群才华横溢的金匠制作而成:Hearth Jewelry
2019/03/22 全球购物
财务担保书范文
2014/04/02 职场文书
房产销售独家委托书范本
2014/10/01 职场文书
分居协议书范本(律师见证版)
2014/11/26 职场文书
2015年销售员工作总结范文
2015/04/07 职场文书
环境保护宣传标语大全!
2019/06/28 职场文书
代码解析React中setState同步和异步问题
2021/06/03 Javascript
Java字符串逆序方法详情
2022/03/21 Java/Android
GPU服务器的多用户配置方法
2022/07/07 Servers