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 相关文章推荐
快速配置PHPMyAdmin方法
Jun 05 PHP
基于php split()函数的用法详解
Jun 05 PHP
ThinkPHP中I(),U(),$this->post()等函数用法
Nov 22 PHP
PHP生成json和xml类型接口数据格式
May 17 PHP
百万级别知乎用户数据抓取与分析之PHP开发
Sep 28 PHP
php抓取网站图片并保存的实现方法
Oct 29 PHP
PHP使用strtotime获取上个月、下个月、本月的日期
Dec 30 PHP
PHP版本的选择5.2.17 5.3.27 5.3.28 5.4 5.5兼容性问题分析
Apr 04 PHP
thinkphp修改配置进入默认首页的方法
Feb 07 PHP
php实现支持中文的文件下载功能示例
Aug 30 PHP
php array 转json及java 转换 json数据格式操作示例
Nov 13 PHP
php远程请求CURL案例(爬虫、保存登录状态)
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
SWFUpload与CI不能正确上传识别文件MIME类型解决方法分享
2011/04/18 PHP
php URL验证正则表达式
2011/07/19 PHP
php中判断文件空目录是否有读写权限的函数代码
2012/08/07 PHP
解析web文件操作常见安全漏洞(目录、文件名检测漏洞)
2013/06/29 PHP
thinkPHP实现瀑布流的方法
2014/11/29 PHP
php实现复制移动文件的方法
2015/07/29 PHP
yii2.0整合阿里云oss上传单个文件的示例
2017/09/19 PHP
PHP 7.4中使用预加载的方法详解
2019/07/08 PHP
js事件(Event)知识整理
2012/10/11 Javascript
ExtJS DOM元素操作经验分享
2013/08/28 Javascript
jquery 添加节点的几种方法介绍
2013/09/04 Javascript
Js保留小数点的4种效果实现代码分享
2014/04/12 Javascript
GitHub上一些实用的JavaScript的文件压缩解压缩库推荐
2016/03/13 Javascript
javascript表单处理具体实现代码(表单、链接、按钮)
2016/05/07 Javascript
JS实现的二叉树算法完整实例
2017/04/06 Javascript
前端页面文件拖拽上传模块js代码示例
2017/05/19 Javascript
js数据类型检测总结
2018/08/05 Javascript
webpack4 处理CSS的方法示例
2018/09/03 Javascript
vue router 源码概览案例分析
2018/10/09 Javascript
JavaScript函数的特性与应用实践深入详解
2018/12/30 Javascript
Python Web框架Flask中使用新浪SAE云存储实例
2015/02/08 Python
Python IDLE 错误:IDLE''s subprocess didn''t make connection 的解决方案
2017/02/13 Python
python实现跨excel的工作表sheet之间的复制方法
2018/05/03 Python
Python队列RabbitMQ 使用方法实例记录
2019/08/05 Python
python GUI库图形界面开发之PyQt5开发环境配置与基础使用
2020/02/25 Python
用 Python 制作地球仪的方法
2020/04/24 Python
css3利用transform变形结合事件完成扇形导航
2020/10/26 HTML / CSS
Manuka Doctor英国官网:真正的麦卢卡蜂蜜和护肤品
2018/10/26 全球购物
北京华建集团SQL面试题
2014/06/03 面试题
计算机应用专业应届毕业生中文求职信范文
2013/11/29 职场文书
寄语十八大感言
2014/02/07 职场文书
学校消防演习方案
2014/02/19 职场文书
国际贸易求职信
2014/07/05 职场文书
业务内勤岗位职责
2015/04/13 职场文书
仅用一句SQL更新整张表的涨跌幅、涨跌率的解决方案
2021/05/06 MySQL
解决Jenkins集成SonarQube遇到的报错问题
2021/07/15 Java/Android