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 相关文章推荐
用Flash图形化数据(一)
Oct 09 PHP
php提交表单时判断 if($_POST[submit])与 if(isset($_POST[submit])) 的区别
Feb 08 PHP
php实现快速排序法函数代码
Aug 27 PHP
深入PHP中的HashTable结构详解
Jun 13 PHP
php创建和删除目录函数介绍和递归删除目录函数分享
Nov 18 PHP
PHP创建word文档的方法(平台无关)
Mar 29 PHP
php  PATH_SEPARATOR判断当前服务器系统类型实例
Oct 28 PHP
cakephp2.X多表联合查询join及使用分页查询的方法
Feb 23 PHP
php7基于递归实现删除空文件夹的方法示例
Jun 15 PHP
Laravel实现短信注册的示例代码
May 29 PHP
基于Laravel 5.2 regex验证的正确写法
Sep 29 PHP
php设计模式之状态模式实例分析【星际争霸游戏案例】
Mar 26 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 编程的 5个良好习惯
2009/02/20 PHP
浅析php单例模式
2014/11/25 PHP
功能强大的PHP图片处理类(水印、透明度、旋转)
2015/10/21 PHP
zen_cart实现支付前生成订单的方法
2016/05/06 PHP
自定义min版smarty模板引擎MinSmarty.class.php文件及用法
2016/05/20 PHP
Zend Framework入门教程之Zend_Registry组件用法详解
2016/12/09 PHP
PHP基于curl post实现发送url及相关中文乱码问题解决方法
2017/11/25 PHP
自动更新作用
2006/10/08 Javascript
javascript预览上传图片发现的问题的解决方法
2010/11/25 Javascript
在JavaScript中构建ArrayList示例代码
2014/09/17 Javascript
Immutable 在 JavaScript 中的应用
2016/05/02 Javascript
深入理解JavaScript中的尾调用(Tail Call)
2017/02/07 Javascript
图文详解Javascript中的上下文和作用域
2017/02/15 Javascript
vue.js树形组件之删除双击增加分支实例代码
2017/02/28 Javascript
JavaScript 隐性类型转换步骤浅析
2018/03/15 Javascript
微信小程序MUI侧滑导航菜单示例(Popup弹出式,左侧滑动,右侧不动)
2019/01/23 Javascript
vue cli3.0结合echarts3.0与地图的使用方法示例
2019/03/26 Javascript
webpack的 rquire.context用法实现工程自动化的方法
2020/02/07 Javascript
ES6新增的数组知识实例小结
2020/05/23 Javascript
vue仿携程轮播图效果(滑动轮播,下方高度自适应)
2021/02/11 Vue.js
Python深入学习之特殊方法与多范式
2014/08/31 Python
numpy中矩阵合并的实例
2018/06/15 Python
Python实现K折交叉验证法的方法步骤
2019/07/11 Python
扩展Django admin的list_filter()可使用范围方法
2019/08/21 Python
opencv3/C++ 平面对象识别&透视变换方式
2019/12/11 Python
物流管理应届生求职信
2013/11/07 职场文书
数学教学随笔感言
2014/02/17 职场文书
学习十八大报告感言
2014/02/28 职场文书
竞选班委演讲稿
2014/04/28 职场文书
暖通工程师岗位职责
2014/06/12 职场文书
成品仓管员岗位职责
2015/04/01 职场文书
主婚人致辞精选
2015/07/28 职场文书
公司财务管理制度
2015/08/04 职场文书
电子表的操作介绍说明书
2019/10/28 职场文书
完美解决golang go get私有仓库的问题
2021/05/05 Golang
vue中 this.$set的使用详解
2021/11/17 Vue.js