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的一个完整SMTP类(解决邮件服务器需要验证时的问题)
Oct 09 PHP
php数组函数序列之array_flip() 将数组键名与值对调
Nov 07 PHP
UCenter 批量添加用户的php代码
Jul 17 PHP
mcrypt启用 加密以及解密过程详细解析
Aug 07 PHP
php使用substr()和strpos()联合查找字符串中某一特定字符的方法
May 12 PHP
ThinkPHP设置禁止百度等搜索引擎转码(简单实用)
Feb 15 PHP
基于PHP实现数据分页显示功能
May 26 PHP
PHP入门教程之表单与验证实例详解
Sep 11 PHP
利用PHP生成CSV文件简单示例
Dec 21 PHP
PHP时间函数使用详解
Mar 21 PHP
laravel 根据不同组织加载不同视图的实现
Oct 14 PHP
基于Laravel 多个中间件的执行顺序详解
Oct 21 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
使用户点击后退按钮使效三行代码
2007/07/07 Javascript
JavaScript 变量命名规则
2009/09/23 Javascript
JavaScript中各种编码解码函数的区别和注意事项
2010/08/19 Javascript
有趣的javascript数组定义方法
2010/09/10 Javascript
JQuery记住用户名密码实现下次自动登录功能
2015/04/27 Javascript
JS实现方向键切换输入框焦点的方法
2015/08/19 Javascript
js实现tab切换效果实例
2015/09/16 Javascript
vue插件tab选项卡使用小结
2016/10/27 Javascript
vuejs父子组件通信的问题
2017/01/11 Javascript
NodeJS处理Express中异步错误
2017/03/26 NodeJs
详解vue 实例方法和数据
2017/10/23 Javascript
Vue shopCart 组件开发详解
2018/01/26 Javascript
JS实现获取word文档内容并输出显示到html页面示例
2018/06/23 Javascript
在Vue中用canvas实现二维码和图片合成海报的方法
2019/06/10 Javascript
微信小程序商品详情页底部弹出框
2019/11/22 Javascript
Vue实现Header渐隐渐现效果的实例代码
2020/11/05 Javascript
Vue +WebSocket + WaveSurferJS 实现H5聊天对话交互的实例
2020/11/18 Vue.js
Windows下实现Python2和Python3两个版共存的方法
2015/06/12 Python
Django ORM框架的定时任务如何使用详解
2017/10/19 Python
python+selenium实现登录账户后自动点击的示例
2017/12/22 Python
浅谈Python3中strip()、lstrip()、rstrip()用法详解
2019/04/29 Python
Python 的AES加密与解密实现
2019/07/09 Python
基于python实现把json数据转换成Excel表格
2020/05/07 Python
详解scrapy内置中间件的顺序
2020/09/28 Python
如何在Win10系统使用Python3连接Hive
2020/10/15 Python
武汉世纪畅想数字传播有限公司 .NET笔试题
2015/06/13 面试题
超市业务员岗位职责
2013/12/05 职场文书
2014年上半年工作自我评价
2014/01/18 职场文书
体育教师自我鉴定
2014/02/12 职场文书
生物技术专业求职信
2014/06/10 职场文书
干部作风建设年活动剖析材料
2014/10/23 职场文书
2014年话务员工作总结
2014/11/19 职场文书
工作失职自我检讨书
2015/05/05 职场文书
Python代码,能玩30多款童年游戏!这些有几个是你玩过的
2021/04/27 Python
CSS的class与id常用的命名规则
2021/05/18 HTML / CSS
制作能在nginx和IIS中使用的ssl证书
2021/06/21 Servers