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函数)
Oct 09 PHP
PHP类中Static方法效率测试代码
Oct 17 PHP
PHP的异常处理类Exception的使用及说明
Jun 13 PHP
PHP中比较时间大小实例
Aug 21 PHP
PHP、Python和Javascript的装饰器模式对比
Feb 03 PHP
php使用Session和文件统计在线人数
Jul 04 PHP
php表单文件iframe异步上传实例讲解
Jul 26 PHP
php实现往pdf中加数字签名操作示例【附源码下载】
Aug 07 PHP
php项目中类的自动加载实例讲解
Sep 12 PHP
TP3.2框架分页相关实现方法分析
Jun 03 PHP
详解php反序列化
Jun 10 PHP
php中yii框架实例用法
Dec 22 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中常用字符串处理代码片段整理
2011/11/07 PHP
如何在PHP中使用正则表达式进行查找替换
2013/06/13 PHP
Laravel使用Caching缓存数据减轻数据库查询压力的方法
2016/03/15 PHP
Joomla简单判断用户是否登录的方法
2016/05/04 PHP
CI框架支持$_GET的两种实现方法
2016/05/18 PHP
PHP CURL与java http使用方法详解
2018/01/26 PHP
Laravel框架路由设置与使用示例
2018/06/12 PHP
PHP微商城开源代码实例
2019/03/27 PHP
jquery实现通用版鼠标经过淡入淡出效果
2014/06/15 Javascript
jQuery实现可用于博客的动态滑动菜单完整实例
2015/09/17 Javascript
JS原型、原型链深入理解
2016/02/27 Javascript
全屏滚动插件fullPage.js使用实例解析
2016/10/21 Javascript
jquery 实现复选框的全选操作实例代码
2017/01/24 Javascript
vue.js中toast用法及使用toast弹框的实例代码
2018/08/27 Javascript
vue 优化CDN加速的方法示例
2018/09/19 Javascript
JS面试题大坑之隐式类型转换实例代码
2018/10/14 Javascript
基于vue-cli3+typescript的tsx开发模板搭建过程分享
2020/02/28 Javascript
详解关于Vue单元测试的几个坑
2020/04/26 Javascript
删除目录下相同文件的python代码(逐级优化)
2012/05/25 Python
Python图像灰度变换及图像数组操作
2016/01/27 Python
深入解析Python中的list列表及其切片和迭代操作
2016/03/13 Python
Python中单、双下划线的区别总结
2017/12/01 Python
解决Python安装后pip不能用的问题
2018/06/12 Python
python解析xml简单示例
2019/06/21 Python
python按键按住不放持续响应的实例代码
2019/07/17 Python
使用Python自动生成HTML的方法示例
2019/08/06 Python
python关于变量名的基础知识点
2020/03/03 Python
keras.layer.input()用法说明
2020/06/16 Python
详解用Python爬虫获取百度企业信用中企业基本信息
2020/07/02 Python
Python3 pyecharts生成Html文件柱状图及折线图代码实例
2020/09/29 Python
python 装饰器的使用示例
2020/10/10 Python
英国在线女鞋目的地:SIMMI
2018/12/27 全球购物
美国购买韩国护肤和美容产品网站:Althea Korea
2020/11/16 全球购物
大学生自我鉴定书
2014/03/24 职场文书
2015年平安创建工作总结
2015/04/29 职场文书
background-position百分比原理详解
2021/05/08 HTML / CSS