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 相关文章推荐
xss防御之php利用httponly防xss攻击
Mar 21 PHP
PHP封装的一个支持HTML、JS、PHP重定向的多功能跳转函数
Jun 19 PHP
destoon安全设置中需要设置可写权限的目录及文件
Jun 21 PHP
PHP跨平台获取服务器IP地址自定义函数分享
Dec 29 PHP
基于PHP如何把汉字转化为拼音
Dec 11 PHP
php遍历解析xml字符串的方法
May 05 PHP
Thinkphp3.2.3整合phpqrcode生成带logo的二维码
Jul 21 PHP
php文件上传及下载附带显示文件及目录功能
Apr 27 PHP
laravel 数据迁移与 Eloquent ORM的实现方法
Apr 12 PHP
thinkPHP和onethink微信支付插件分享
Aug 11 PHP
PHP下载文件函数与用法示例
Sep 27 PHP
laravel model 两表联查示例
Oct 24 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 文件上传源码分析(RFC1867)
2009/10/30 PHP
FirePHP 推荐一款PHP调试工具
2011/04/23 PHP
PHP基于文件存储实现缓存的方法
2015/07/20 PHP
微信支付开发维权通知实例
2016/07/12 PHP
PHP中Socket连接及读写数据超时问题分析
2016/07/19 PHP
THINKPHP3.2使用soap连接webservice的解决方法
2017/12/13 PHP
自动完成JS类(纯JS, Ajax模式)
2009/03/12 Javascript
jquery radio 操作代码
2011/03/16 Javascript
对象无length属性时IE6/IE7中无法将其转换成伪数组(ArrayLike)
2011/07/31 Javascript
open 动态修改img的onclick事件示例代码
2013/11/13 Javascript
jquery的ajax简单结构示例代码
2014/02/17 Javascript
javascript学习笔记(二)数组和对象部分
2014/09/30 Javascript
JavaScript中的Primitive对象封装介绍
2014/12/31 Javascript
JS触发服务器控件的单击事件(详解)
2016/08/06 Javascript
Angular2  NgModule 模块详解
2016/10/19 Javascript
JS实现商品筛选功能
2020/08/19 Javascript
利用node.js制作命令行工具方法教程(一)
2017/06/22 Javascript
AngualrJs清除定时器遇到的坑
2017/10/13 Javascript
Vue 按键修饰符处理事件的方法
2018/05/04 Javascript
Python OS模块常用函数说明
2015/05/23 Python
Python中第三方库Requests库的高级用法详解
2017/03/12 Python
对python中两种列表元素去重函数性能的比较方法
2018/06/29 Python
python查找指定文件夹下所有文件并按修改时间倒序排列的方法
2018/10/21 Python
Python.append()与Python.expand()用法详解
2019/12/18 Python
使用遗传算法求二元函数的最小值
2020/02/11 Python
python输出第n个默尼森数的实现示例
2020/03/08 Python
Django-silk性能测试工具安装及使用解析
2020/11/28 Python
pyspark对Mysql数据库进行读写的实现
2020/12/30 Python
python数据抓取3种方法总结
2021/02/07 Python
CSS3中的opacity属性使用教程
2015/08/19 HTML / CSS
ProBikeKit澳大利亚:自行车套件,跑步和铁人三项装备
2016/11/30 全球购物
Python是如何进行类型转换的
2013/06/09 面试题
国贸专业的职业规划范文
2014/01/23 职场文书
办公室打字员岗位职责
2014/04/16 职场文书
党旗在我心中演讲稿
2014/09/15 职场文书
JS setTimeout与setInterval的区别
2022/04/20 Javascript