php实现事件监听与触发的方法


Posted in PHP onNovember 21, 2014

本文实例讲述了php实现事件监听与触发的方法。分享给大家供大家参考。具体分析如下:

闲来无事,想了想PHP如何实现事件监听,参考了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 相关文章推荐
一个基于PDO的数据库操作类
Mar 24 PHP
php判断手机访问还是电脑访问示例分享
Jan 20 PHP
php网页病毒清除类
Dec 08 PHP
PHP中使用CURL获取页面title例子
Jan 07 PHP
php在apache环境下实现gzip配置方法
Apr 02 PHP
php mongodb操作类 带几个简单的例子
Aug 25 PHP
php版微信开发Token验证失败或请求URL超时问题的解决方法
Sep 23 PHP
PHP输出XML格式数据的方法总结
Feb 08 PHP
yii2使用GridView实现数据全选及批量删除按钮示例
Mar 01 PHP
thinkPHP框架整合tcpdf插件操作示例
Aug 07 PHP
Laravel5框架自定义错误页面配置操作示例
Apr 17 PHP
php集成开发环境详解
Sep 24 PHP
PHP通过内置函数memory_get_usage()获取内存使用情况
Nov 20 #PHP
IIS下PHP的三种配置方式对比
Nov 20 #PHP
PHP程序员常见的40个陋习,你中了几个?
Nov 20 #PHP
php目录遍历函数opendir用法实例
Nov 20 #PHP
php中base_convert()进制数字转换函数实例
Nov 20 #PHP
PHP PDOStatement对象bindpram()、bindvalue()和bindcolumn之间的区别
Nov 20 #PHP
PDO预处理语句PDOStatement对象使用总结
Nov 20 #PHP
You might like
教你如何把一篇文章按要求分段
2006/10/09 PHP
php学习之简单计算器实现代码
2011/06/09 PHP
3种方法轻松处理php开发中emoji表情的问题
2016/07/18 PHP
thinkPHP商城公告功能开发问题分析
2016/12/01 PHP
yii2局部关闭(开启)csrf的验证的实例代码
2017/07/10 PHP
表单填写时用回车代替TAB的实现方法
2007/10/09 Javascript
jQuery怎么解析Json字符串(Json格式/Json对象)
2013/08/09 Javascript
关于Jquery操作Cookie取值错误的解决方法
2013/08/26 Javascript
jquery、js操作checkbox全选反选
2014/03/12 Javascript
JavaScript常用字符串与数组扩展函数小结
2016/04/24 Javascript
js实现简单音乐播放器
2020/06/30 Javascript
JavaScript前后端JSON使用方法教程
2020/11/23 Javascript
[34:10]Secret vs VG 2019国际邀请赛淘汰赛 败者组 BO3 第二场 8.24
2019/09/10 DOTA
[45:17]DOTA2-DPC中国联赛定级赛 Phoenix vs DLG BO3第三场 1月9日
2021/03/11 DOTA
python二分法实现实例
2013/11/21 Python
python列表去重的二种方法
2014/02/14 Python
Python中的CURL PycURL使用例子
2014/06/01 Python
对于Python的Django框架部署的一些建议
2015/04/09 Python
Python 使用SMTP发送邮件的代码小结
2016/09/21 Python
Python删除n行后的其他行方法
2019/01/28 Python
详解Django+uwsgi+Nginx上线最佳实战
2019/03/14 Python
Python基于BeautifulSoup爬取京东商品信息
2020/06/01 Python
python获取本周、上周、本月、上月及本季的时间代码实例
2020/09/08 Python
约瑟夫·特纳男装:Joseph Turner
2017/10/10 全球购物
Everything But Water官网:美国泳装品牌
2019/03/17 全球购物
爱尔兰电脑、家电和家具购物网站:Buy It Direct
2019/07/09 全球购物
工程业务员岗位职责
2013/12/31 职场文书
给护士表扬信
2014/01/19 职场文书
《我不是最弱小的》教学反思
2014/02/23 职场文书
《生命的药方》教学反思
2014/04/08 职场文书
党组织领导班子整改方案
2014/10/25 职场文书
学校2014年度工作总结
2014/12/06 职场文书
庐山导游词
2015/02/03 职场文书
2015年社会治安综合治理工作总结
2015/04/10 职场文书
大学生安全教育心得体会
2016/01/15 职场文书
2019最新劳动仲裁申请书!
2019/07/08 职场文书