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 相关文章推荐
codeigniter框架批量插入数据
Jan 09 PHP
Yii使用ajax验证显示错误messagebox的解决方法
Dec 03 PHP
jquery+php实现导出datatables插件数据到excel的方法
Jul 06 PHP
php生成gif动画的方法
Nov 05 PHP
php面向对象编程self和static的区别
May 08 PHP
php代码检查代理ip的有效性
Aug 19 PHP
php实现XML和数组的相互转化功能示例
Feb 08 PHP
利用php-cli和任务计划实现订单同步功能的方法
May 03 PHP
实例分析PHP中PHPMailer发邮件
Dec 13 PHP
php-msf源码详解
Dec 25 PHP
PHP实现获取ip地址的5种方法,以及插入用户登录日志操作示例
Feb 28 PHP
PHP命令行与定时任务
Apr 01 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文件上传判断file是否己选择上传文件的方法
2014/11/10 PHP
php中strlen和mb_strlen用法实例分析
2016/11/12 PHP
CakePHP框架Model关联对象用法分析
2017/08/04 PHP
ext读取两种结构的xml的代码
2008/11/05 Javascript
Javascript实现CheckBox的全选与取消全选的代码
2010/07/20 Javascript
Ajax异步提交表单数据的说明及方法实例
2013/06/22 Javascript
GridView中获取被点击行中的DropDownList和TextBox中的值
2013/07/18 Javascript
javascript实现页面内关键词高亮显示代码
2014/04/03 Javascript
JavaScript结合AJAX_stream实现流式显示
2015/01/08 Javascript
JavaScript中的parse()方法使用简介
2015/06/12 Javascript
使用coffeescript编写node.js项目的方法汇总
2015/08/05 Javascript
JavaScript结合Bootstrap仿微信后台多图文界面管理
2016/07/22 Javascript
Node.js中使用jQuery的做法
2016/08/17 Javascript
JS自定义函数对web前端上传的文件进行类型大小判断
2016/10/19 Javascript
AngulaJS路由 ui-router 传参实例
2017/04/28 Javascript
Vue.js子组件向父组件通信的方法实例代码详解
2018/12/10 Javascript
JS拖拽排序插件Sortable.js用法实例分析
2019/02/20 Javascript
如何使用Javascript中的this关键字
2020/05/28 Javascript
[02:52]2014DOTA2西雅图国际邀请赛 CIS战队巡礼
2014/07/07 DOTA
[50:34]VGJ.T vs Fnatic 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
详解Python中find()方法的使用
2015/05/18 Python
Python字符和字符值(ASCII或Unicode码值)转换方法
2015/05/21 Python
Python中的ctime()方法使用教程
2015/05/22 Python
分享一下Python 开发者节省时间的10个方法
2015/10/02 Python
python连接mysql实例分享
2016/10/09 Python
Python爬虫实现爬取京东手机页面的图片(实例代码)
2017/11/30 Python
对python3 urllib包与http包的使用详解
2018/05/10 Python
在cmd中运行.py文件: python的操作步骤
2018/05/12 Python
Python读写及备份oracle数据库操作示例
2018/05/17 Python
Python+Selenium实现自动化的环境搭建的步骤(图文)
2020/09/01 Python
html5文字阴影效果text-shadow使用示例
2013/07/25 HTML / CSS
益模软件Java笔试题
2012/03/27 面试题
医院合作协议书
2014/08/19 职场文书
中秋节活动总结
2014/08/29 职场文书
在校生证明
2015/06/17 职场文书
浅谈Python数学建模之整数规划
2021/06/23 Python