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的header和asp中的redirect比较
Oct 09 PHP
PHP中的正规表达式(一)
Oct 09 PHP
PHP下10件你也许并不了解的事情
Sep 11 PHP
php上传图片存入数据库示例分享
Mar 11 PHP
php按单词截取字符串的方法
Apr 07 PHP
Mac环境下php操作mysql数据库的方法分享
May 11 PHP
fsockopen pfsockopen函数被禁用,SMTP发送邮件不正常的解决方法
Sep 20 PHP
PHP利用APC模块实现大文件上传进度条的方法
Oct 29 PHP
php 算法之实现相对路径的实例
Oct 17 PHP
关于ThinkPHP中的异常处理详解
May 11 PHP
微信公众平台开发教程③ PHP实现微信公众号支付功能图文详解
Apr 10 PHP
浅谈laravel aliases别名的原理
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 如何获取数组第一个值
2013/08/06 PHP
ThinkPHP3.2.1图片验证码实现方法
2016/08/19 PHP
php实现的双色球算法示例
2017/06/20 PHP
js下获取div中的数据的原理分析
2010/04/07 Javascript
javascript中字符串拼接详解
2014/09/26 Javascript
js实现点击添加一个input节点
2014/12/05 Javascript
JS+CSS实现滑动切换tab菜单效果
2015/08/25 Javascript
详解Nodejs基于mongoose模块的增删改查的操作
2016/12/21 NodeJs
Node.js的特点详解
2017/02/03 Javascript
jQuery分页插件jquery.pagination.js使用方法解析
2017/02/09 Javascript
详谈$.data()的用法和作用
2017/02/13 Javascript
webpack学习教程之publicPath路径问题详解
2017/06/17 Javascript
详解如何在vue项目中引入elementUI组件
2018/02/11 Javascript
基于 D3.js 绘制动态进度条的实例详解
2018/02/26 Javascript
Mac下通过brew安装指定版本的nodejs教程
2018/05/17 NodeJs
Bootstrap Table列宽拖动的方法
2018/08/15 Javascript
vue-cli 使用vue-bus来全局控制的实例讲解
2018/09/15 Javascript
详解JavaScript的内存空间、赋值和深浅拷贝
2019/04/17 Javascript
vue中的过滤器实例代码详解
2019/06/06 Javascript
python基础教程之数字处理(math)模块详解
2014/03/25 Python
Django Form 实时从数据库中获取数据的操作方法
2019/07/25 Python
python操作excel让工作自动化
2019/08/09 Python
Python中 CSV格式清洗与转换的实例代码
2019/08/29 Python
解决安装pyqt5之后无法打开spyder的问题
2019/12/13 Python
Python 简单计算要求形状面积的实例
2020/01/18 Python
俄罗斯香水和化妆品购物网站:Л’Этуаль
2018/05/10 全球购物
泰海淘:泰国king Power王权免税集团旗下跨境海淘综合型电商
2020/07/26 全球购物
物理教学随笔感言
2014/02/22 职场文书
《春晓》教学反思
2014/04/20 职场文书
党的群众路线对照检查材料
2014/09/22 职场文书
医院党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
海南召开党的群众路线教育实践活动总结大会新闻稿
2014/10/21 职场文书
大学生党性分析材料
2014/12/19 职场文书
欧也妮葛朗台读书笔记
2015/06/30 职场文书
小程序与后端Java接口交互实现HelloWorld入门
2021/07/09 Java/Android
Go语言安装并操作redis的go-redis库
2022/04/14 Golang