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.MVC的模板标签系统(三)
Sep 05 PHP
在PWS上安装PHP4.0正式版
Oct 09 PHP
php mssql 时间格式问题
Jan 13 PHP
php防攻击代码升级版
Dec 29 PHP
web目录下不应该存在多余的程序(安全考虑)
May 09 PHP
php中使用array_filter()函数过滤空数组的实现代码
Aug 19 PHP
php实现改变图片直接打开为下载的方法
Apr 14 PHP
Zend Framework教程之请求对象的封装Zend_Controller_Request实例详解
Mar 07 PHP
PHP 将dataurl转成图片image方法总结
Oct 14 PHP
php获取微信共享收货地址的方法
Dec 21 PHP
PHP parse_ini_file函数的应用与扩展操作示例
Jan 07 PHP
PHP get_html_translation_table()函数用法讲解
Feb 16 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入门的学习方法
2007/01/02 PHP
php&mysql 日期操作小记
2012/02/27 PHP
php使用fgetcsv读取csv文件出现乱码的解决方法
2014/11/08 PHP
基于php的微信公众平台开发入门实例
2015/04/15 PHP
实例分析10个PHP常见安全问题
2019/07/09 PHP
js形成页面的一种遮罩效果实例代码
2014/01/04 Javascript
jquery插件jSignature实现手动签名
2015/05/04 Javascript
angularjs实现文字上下无缝滚动特效代码
2016/09/04 Javascript
JavaScript实现瀑布流以及加载效果
2017/02/11 Javascript
windows下vue.js开发环境搭建教程
2017/03/20 Javascript
JavaScript中Require调用js的实例分享
2017/10/27 Javascript
浅谈MUI框架中加载外部网页或服务器数据的方法
2018/01/31 Javascript
angularjs的单选框+ng-repeat的实现方法
2018/09/12 Javascript
vue前端框架—Mint UI详解(更适用于移动端)
2019/04/30 Javascript
JS用最简单的方法实现四舍五入
2019/08/27 Javascript
在Python中封装GObject模块进行图形化程序编程的教程
2015/04/14 Python
Python处理字符串之isspace()方法的使用
2015/05/19 Python
Python从文件中读取数据的方法讲解
2019/02/14 Python
Python创建字典的八种方式
2019/02/27 Python
使用python实现ftp的文件读写方法
2019/07/02 Python
基于python的Paxos算法实现
2019/07/03 Python
使用Django实现把两个模型类的数据聚合在一起
2020/03/28 Python
Django bulk_create()、update()与数据库事务的效率对比分析
2020/05/15 Python
HTML5 DeviceOrientation实现手机网站摇一摇功能代码实例
2015/04/24 HTML / CSS
HTML5+CSS3实现机器猫
2016/10/17 HTML / CSS
巴塞罗那观光通票:Barcelona Pass
2019/10/30 全球购物
零件设计自荐信范文
2013/11/27 职场文书
中专生职业生涯规划书范文
2014/01/10 职场文书
管理失职检讨书
2014/02/12 职场文书
酒店开业庆典主持词
2014/03/21 职场文书
广播体操比赛口号
2014/06/10 职场文书
党支部班子“四风”问题自我剖析材料
2014/09/28 职场文书
2014全年工作总结
2014/11/27 职场文书
golang http使用踩过的坑与填坑指南
2021/04/27 Golang
Selenium浏览器自动化如何上传文件
2022/04/06 Python
js 实现验证码输入框示例详解
2022/09/23 Javascript