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 相关文章推荐
PHP 日志缩略名的创建函数代码
May 26 PHP
php stripslashes和addslashes的区别
Feb 03 PHP
跟我学Laravel之配置Laravel
Oct 15 PHP
Laravel 5框架学习之Eloquent 关系
Apr 09 PHP
WordPress中用于获取文章作者与分类信息的方法整理
Dec 17 PHP
Laravel SQL语句记录方式(推荐)
May 26 PHP
利用PHP将图片转换成base64编码的实现方法
Sep 13 PHP
关于ThinkPhp 框架表单验证及ajax验证问题
Jul 19 PHP
Thinkphp开发--集成极光推送
Sep 15 PHP
PHP二维关联数组的遍历方式(实例讲解)
Oct 18 PHP
Yaf框架封装的MySQL数据库操作示例
Mar 06 PHP
PHP常量define和const的区别详解
May 18 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
PHP的中问验证码
2006/11/25 PHP
CodeIgniter框架提示Disallowed Key Characters的解决办法
2014/04/21 PHP
PHP开发注意事项总结
2015/02/04 PHP
php上传图片获取路径及给表单字段赋值的方法
2016/01/23 PHP
ThinkPHP 3.2.3实现加减乘除图片验证码
2018/12/05 PHP
tp5框架前台无限极导航菜单类实现方法分析
2020/03/29 PHP
JavaScript toFixed() 方法
2010/04/15 Javascript
在JS数组特定索引处指定位置插入元素
2014/07/27 Javascript
JavaScript实现可拖拽的拖动层Div实例
2015/08/05 Javascript
原生JS实现拖拽图片效果
2020/08/27 Javascript
简单易懂的天气插件(代码分享)
2017/02/04 Javascript
vue实现文章内容过长点击阅读全文功能的实例
2017/12/28 Javascript
js监听html页面的上下滚动事件方法
2018/09/11 Javascript
将Vue组件库更换为按需加载的方法步骤
2020/05/06 Javascript
解决vuex数据页面刷新后初始化操作
2020/07/26 Javascript
python中将阿拉伯数字转换成中文的实现代码
2011/05/19 Python
python实现从一组颜色中找出与给定颜色最接近颜色的方法
2015/03/19 Python
Python读写Json涉及到中文的处理方法
2016/09/12 Python
python技能之数据导出excel的实例代码
2017/08/11 Python
Python3 使用map()批量的转换数据类型,如str转float的实现
2019/11/29 Python
Python爬虫解析网页的4种方式实例及原理解析
2019/12/30 Python
什么是python的必选参数
2020/06/21 Python
Perfumetrader荷兰:香水、化妆品和护肤品在线商店
2017/09/15 全球购物
Manuka Doctor英国官网:真正的麦卢卡蜂蜜和护肤品
2018/10/26 全球购物
Doyoueven官网:澳大利亚健身服饰和配饰品牌
2019/03/24 全球购物
中西医结合临床医学专业大学生自荐信
2013/09/28 职场文书
财务会计专业个人求职信范本
2014/01/08 职场文书
市场营销求职信范文
2014/02/21 职场文书
《埃及的金字塔》教学反思
2014/04/07 职场文书
2014年五四青年节演讲稿范文
2014/04/22 职场文书
技术岗位竞聘演讲稿
2014/05/16 职场文书
小学生读书活动总结
2014/06/30 职场文书
公司授权委托书格式样本
2014/10/01 职场文书
2015年纪念“卢沟桥事变”78周年活动方案
2015/05/06 职场文书
导游词书写之黄山
2019/08/06 职场文书
springboot创建的web项目整合Quartz框架的项目实践
2022/06/21 Java/Android