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中GET变量的使用
Oct 09 PHP
ThinkPHP3.1新特性之Action参数绑定
Jun 19 PHP
php实现的支持imagemagick及gd库两种处理的缩略图生成类
Sep 23 PHP
PHPUnit安装及使用示例
Oct 29 PHP
PHP aes (ecb)解密后乱码问题
Jun 22 PHP
php简单判断文本编码的方法
Jul 30 PHP
WIFI万能钥匙密码查询接口实例
Sep 28 PHP
php使用CutyCapt实现网页截图保存的方法
Oct 03 PHP
Laravel使用memcached缓存对文章增删改查进行优化的方法
Oct 08 PHP
PHP中递归的实现实例详解
Nov 14 PHP
PHP实现redis限制单ip、单用户的访问次数功能示例
Jun 16 PHP
使用laravel和ajax实现整个页面无刷新的操作方法
Oct 03 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
无线电的诞生过程
2021/03/01 无线电
PHP一些有意思的小区别
2006/12/06 PHP
php的PDO事务处理机制实例分析
2017/02/16 PHP
PHP操作Redis数据库常用方法示例
2018/08/25 PHP
PHP实现Snowflake生成分布式唯一ID的方法示例
2020/08/30 PHP
用js实现预览待上传的本地图片
2007/03/15 Javascript
jQuery使用手册之二 DOM操作
2007/03/24 Javascript
javaScript 删除字符串空格多种方法小结
2012/10/24 Javascript
javascript 初学教程及五子棋小程序的简单实现
2017/07/04 Javascript
nodejs之get/post请求的几种方式小结
2017/07/26 NodeJs
分析javascript中9 个常见错误阻碍你进步
2017/09/18 Javascript
在Vue中使用highCharts绘制3d饼图的方法
2018/02/08 Javascript
Vue+webpack项目基础配置教程
2018/02/12 Javascript
关于Angularjs中自定义指令一些有价值的细节和技巧小结
2018/04/22 Javascript
vue click.stop阻止点击事件继续传播的方法
2018/09/04 Javascript
js实现黑白div块画空心的图形
2018/12/13 Javascript
JavaScript find()方法及返回数据实例
2020/04/30 Javascript
js实现金山打字通小游戏
2020/07/24 Javascript
30分钟搭建Python的Flask框架并在上面编写第一个应用
2015/03/30 Python
浅谈numpy中linspace的用法 (等差数列创建函数)
2017/06/07 Python
pycharm安装和首次使用教程
2018/08/27 Python
python利用7z批量解压rar的实现
2019/08/07 Python
python进阶之自定义可迭代的类
2019/08/20 Python
python垃圾回收机制(GC)原理解析
2019/12/30 Python
PyTorch 普通卷积和空洞卷积实例
2020/01/07 Python
详解Css3新特性应用之过渡与动画
2017/01/10 HTML / CSS
How TDD works
2012/09/30 面试题
学雷锋宣传标语
2014/06/25 职场文书
卖房授权委托书样本
2014/10/05 职场文书
六五普法宣传标语
2014/10/06 职场文书
代办出身证明书
2014/10/21 职场文书
音乐教师个人工作总结
2015/02/06 职场文书
商超业务员岗位职责
2015/02/13 职场文书
清明节寄语2015
2015/03/23 职场文书
某药房的新员工入职告知书!
2019/07/15 职场文书
MySQL query_cache_type 参数与使用详解
2021/07/01 MySQL