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安装攻略:常见问题解答(二)
Oct 09 PHP
使用php判断浏览器的类型和语言的函数代码
Feb 28 PHP
php计算两个整数的最大公约数常用算法小结
Mar 05 PHP
PHP中empty和isset对于参数结构的判断及empty()和isset()的区别
Nov 15 PHP
在CentOS系统上从零开始搭建WordPress博客的全流程记录
Apr 21 PHP
php flush无效,IIS7下php实时输出的方法
Aug 25 PHP
php实现当前页面点击下载文件的实例代码
Nov 16 PHP
php正则提取html图片(img)src地址与任意属性的方法
Feb 08 PHP
详解PHP版本兼容之openssl调用参数
Jul 25 PHP
php图片裁剪函数
Oct 31 PHP
PHP chop()函数讲解
Feb 11 PHP
PHP iconv()函数字符编码转换的问题讲解
Mar 22 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
雄兵连:天使彦天使彦为爱折翼,彦和炙心同时念动的誓言!
2020/03/02 国漫
利用PHP实现短域名互转
2013/07/05 PHP
PHP统计目录大小的自定义函数分享
2014/11/18 PHP
PHP中ajax无刷新上传图片与图片下载功能
2017/02/21 PHP
PHP简单获取随机数的常用方法小结
2017/06/07 PHP
利用Ext Js生成动态树实例代码
2008/09/08 Javascript
javascript匿名函数应用示例介绍
2014/03/07 Javascript
javascript实现input file上传图片预览效果
2015/12/31 Javascript
jQuery模拟360浏览器切屏效果幻灯片(附demo源码下载)
2016/01/29 Javascript
vue之数据交互实例代码
2017/06/20 Javascript
react native实现往服务器上传网络图片的实例
2017/08/07 Javascript
vue中动态设置meta标签和title标签的方法
2018/07/11 Javascript
浅谈从React渲染流程分析Diff算法
2018/09/08 Javascript
JS原生带缩略图的图片切换效果
2018/10/10 Javascript
IDEA安装vue插件图文详解
2019/09/26 Javascript
对变量赋值的理解--Pyton中让两个值互换的实现方法
2017/11/29 Python
django+mysql的使用示例
2018/11/23 Python
python pcm音频添加头转成Wav格式文件的方法
2019/01/09 Python
Python Flask框架扩展操作示例
2019/05/03 Python
Python2比较当前图片跟图库哪个图片相似的方法示例
2019/09/28 Python
使用CSS3配合IE滤镜实现渐变和投影的效果
2015/09/06 HTML / CSS
详解html5 canvas 微信海报分享(个人爬坑)
2018/01/12 HTML / CSS
蔻驰西班牙官网:COACH西班牙
2019/01/16 全球购物
美国在线购买内衣网站:HerRoom
2020/02/22 全球购物
如果一个类实现了多个接口但是这些接口有相同的方法名将会怎样
2013/06/16 面试题
校园环保建议书
2014/05/14 职场文书
法律系毕业生求职信
2014/05/28 职场文书
2014年便民服务中心工作总结
2014/12/20 职场文书
建议书范文
2015/02/05 职场文书
大学生学习十八届五中全会精神心得体会
2016/01/05 职场文书
幼儿园班级管理心得体会
2016/01/07 职场文书
初中地理教学反思
2016/02/19 职场文书
详解MySQL中的pid与socket
2021/06/15 MySQL
nginx请求限制配置方法
2021/07/09 Servers
详解Mysql数据库平滑扩容解决高并发和大数据量问题
2022/05/25 MySQL
python playwrigh框架入门安装使用
2022/07/23 Python