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 相关文章推荐
一个可查询所有表的“通用”查询分页类
Oct 09 PHP
用windows下编译过的eAccelerator for PHP 5.1.6实现php加速的使用方法
Sep 30 PHP
php和javascript之间变量的传递实现代码
Dec 19 PHP
php设计模式之命令模式的应用详解
May 21 PHP
PHP中执行cmd命令的方法
Oct 11 PHP
PHP 抽象方法与抽象类abstract关键字介绍及应用
Oct 16 PHP
Yii配置文件用法详解
Dec 04 PHP
Json_decode 解析json字符串为NULL的解决方法(必看)
Feb 17 PHP
PHP实现ASCII码与字符串相互转换的方法
Apr 29 PHP
PHP实现超简单的SSL加密解密、验证及签名的方法示例
Aug 28 PHP
tp5框架无刷新分页实现方法分析
Sep 26 PHP
基于Laravel 多个中间件的执行顺序详解
Oct 21 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
Protoss建筑一览
2020/03/14 星际争霸
法国:浪漫之都的咖啡文化
2021/03/03 咖啡文化
PHP错误Parse error: syntax error, unexpected end of file in test.php on line 12解决方法
2014/06/23 PHP
php5.3后静态绑定用法详解
2016/11/11 PHP
laravel 5.4中实现无限级分类的方法示例
2017/07/27 PHP
jQuery与其它库冲突的解决方法
2010/06/25 Javascript
收集的10个免费的jQuery相册
2011/02/26 Javascript
jquery中获取id值方法小结
2013/09/22 Javascript
javascript实现左右控制无缝滚动
2014/12/31 Javascript
JavaScript使用DeviceOne开发实战(四)仿优酷视频应用
2015/12/02 Javascript
javascript基于prototype实现类似OOP继承的方法
2015/12/16 Javascript
js实现的页面加载完毕之前loading提示效果完整示例【附demo源码下载】
2016/08/02 Javascript
给easyui datebox扩展一个清空的实例
2016/11/09 Javascript
jQuery实现大图轮播
2017/02/13 Javascript
100多个基础常用JS函数和语法集合大全
2017/02/16 Javascript
Bootstrap 响应式实用工具实例详解
2017/03/29 Javascript
Node.js实现文件上传的示例
2017/06/28 Javascript
微信小程序支付之c#后台实现方法
2017/10/19 Javascript
浅谈vue单一组件下动态修改数据时的全部重渲染
2018/03/01 Javascript
JS使用JSON.parse(),JSON.stringify()实现对对象的深拷贝功能分析
2019/03/06 Javascript
前端使用crypto.js进行加密的函数代码
2020/08/16 Javascript
vue + el-form 实现的多层循环表单验证
2020/11/25 Vue.js
[02:16]卖萌的僵尸 DOTA2神话信使飞僵小宝来袭
2014/03/24 DOTA
Python3爬虫爬取英雄联盟高清桌面壁纸功能示例【基于Scrapy框架】
2018/12/05 Python
python中文分词库jieba使用方法详解
2020/02/11 Python
PyCharm取消波浪线、下划线和中划线的实现
2020/03/03 Python
Python实现鼠标自动在屏幕上随机移动功能
2020/03/14 Python
Pycharm学生免费专业版安装教程的方法步骤
2020/09/24 Python
python中翻译功能translate模块实现方法
2020/12/17 Python
PyChon中关于Jekins的详细安装(推荐)
2020/12/28 Python
县优秀教师事迹材料
2014/01/31 职场文书
幼儿园感恩节活动方案
2014/10/06 职场文书
2016年圣诞节寄语(一句话)
2015/12/07 职场文书
2016中秋节月饼促销广告语
2016/01/28 职场文书
2016年庆“七一”主题党日活动总结
2016/04/05 职场文书
美甲店的创业计划书模板
2019/08/23 职场文书