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 相关文章推荐
dedecms模版制作使用方法
Apr 03 PHP
apache+php完美解决301重定向的两种方法
Jun 08 PHP
PHP获取网页标题的3种实现方法代码实例
Apr 11 PHP
简单实用的PHP防注入类实例
Dec 05 PHP
php实现数组纵向转横向并过滤重复值的方法分析
May 29 PHP
PHP注释语法规范与命名规范详解篇
Jan 21 PHP
Laravel 实现密码重置功能
Feb 23 PHP
ThinkPHP5 验证器的具体使用
May 31 PHP
浅谈php使用curl模拟多线程发送请求
Mar 08 PHP
PHP从零开始打造自己的MVC框架之路由类实现方法分析
Jun 03 PHP
PHP反射学习入门示例
Jun 14 PHP
Laravel框架下载,安装及路由操作图文详解
Dec 04 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实现分页的一个示例
2006/10/09 PHP
PHP写的加密函数,支持私人密钥(详细介绍)
2013/06/09 PHP
php_screw 1.5:php加密: 安装与使用详解
2013/06/20 PHP
PHP递归调用数组值并用其执行指定函数的方法
2015/04/01 PHP
php使用pdo连接sqlite3的配置示例
2016/05/27 PHP
php操作xml并将其插入数据库的实现方法
2016/09/08 PHP
PHP中的自动加载操作实现方法详解
2019/08/06 PHP
脚本吧 - 幻宇工作室用到js,超强推荐base.js
2006/12/23 Javascript
理解Javascript_14_函数形式参数与arguments
2010/10/20 Javascript
sails框架的学习指南
2014/12/22 Javascript
基于Javascript实现二级联动菜单效果
2016/03/04 Javascript
简单实现的JQuery文本框水印插件
2016/06/14 Javascript
微信小程序 icon组件详细及实例代码
2016/10/25 Javascript
BootStrap Validator对于隐藏域验证和程序赋值即时验证的问题浅析
2016/12/01 Javascript
很棒的一组js图片轮播特效
2017/01/12 Javascript
AngulerJS学习之按需动态加载文件
2017/02/13 Javascript
Vue之Watcher源码解析(1)
2017/07/19 Javascript
JavaScript实现滑动门效果
2020/01/18 Javascript
Python实现的二维码生成小软件
2014/07/11 Python
python使用mysql数据库示例代码
2017/05/21 Python
Django学习教程之静态文件的调用详解
2018/05/08 Python
解决Pycharm出现的部分快捷键无效问题
2018/10/22 Python
对python中if语句的真假判断实例详解
2019/02/18 Python
python使用paramiko模块通过ssh2协议对交换机进行配置的方法
2019/07/25 Python
jenkins配置python脚本定时任务过程图解
2019/10/29 Python
Python eval函数介绍及用法
2020/11/09 Python
CSS3实现swap交换动画
2016/01/19 HTML / CSS
HTML5 Canvas实现玫瑰曲线和心形图案的代码实例
2014/04/10 HTML / CSS
英国最大的奢侈品零售网络商城:Flannels
2016/09/16 全球购物
印度婴儿用品在线商店:Firstcry.com
2016/12/05 全球购物
How TDD works
2012/09/30 面试题
META-INF文件夹中的MANIFEST.MF的作用
2016/06/21 面试题
swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上
2013/07/06 面试题
11月红领巾广播稿
2014/01/17 职场文书
春季运动会开幕词
2015/01/28 职场文书
幼儿园小班开学寄语(2016秋季)
2015/12/03 职场文书