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
DedeCms模板安装/制作概述
Mar 11 PHP
phpmyadmin导入(import)文件限制的解决办法
Dec 11 PHP
PHP使用PHPMailer发送邮件的简单使用方法
Nov 12 PHP
php像数组一样存取和修改字符串字符
Mar 21 PHP
php中使用array_filter()函数过滤空数组的实现代码
Aug 19 PHP
PHP中字符安全过滤函数使用小结
Feb 25 PHP
php header函数的常用http头设置
Jun 25 PHP
PHP正则获取页面所有图片地址
Mar 23 PHP
Laravel4中的Validator验证扩展用法详解
Jul 26 PHP
YII框架中搜索分页jQuery写法详解
Dec 19 PHP
PHP+Mysql+Ajax实现淘宝客服或阿里旺旺聊天功能(前台页面)
Jun 16 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数据导出知识点
2018/02/17 PHP
PHPUnit + Laravel单元测试常用技能
2019/11/06 PHP
js+FSO遍历文件夹下文件并显示
2007/03/07 Javascript
jQuery实现当前页面标签高亮显示的方法
2015/03/10 Javascript
jQuery控制cookie过期时间的方法
2015/04/07 Javascript
再JavaScript的jQuery库中编写动画效果的指南
2015/08/13 Javascript
Jquery-1.9.1源码分析系列(十一)之DOM操作
2015/11/25 Javascript
轻松学习jQuery插件EasyUI EasyUI实现树形网络基本操作(2)
2015/11/30 Javascript
实例讲解避免javascript冲突的方法
2016/01/03 Javascript
JavaScript基础语法之js表达式
2016/06/07 Javascript
JS触摸与手势事件详解
2017/05/09 Javascript
jQuery实现的弹幕效果完整实例
2017/09/06 jQuery
基于Vue+ElementUI的省市区地址选择通用组件
2019/11/20 Javascript
ES6函数实现排它两种写法解析
2020/05/13 Javascript
JS实现前端动态分页码代码实例
2020/06/02 Javascript
Python使用Flask框架同时上传多个文件的方法
2015/03/21 Python
Python中的高级数据结构详解
2015/03/27 Python
Python ValueError: invalid literal for int() with base 10 实用解决方法
2015/06/21 Python
Python利用Nagios增加微信报警通知的功能
2016/02/18 Python
Python实现学生成绩管理系统
2020/04/05 Python
Python操作Sonqube API获取检测结果并打印过程解析
2019/11/27 Python
python_mask_array的用法
2020/02/18 Python
Django 如何使用日期时间选择器规范用户的时间输入示例代码详解
2020/05/22 Python
浅析python中的del用法
2020/09/02 Python
python对批量WAV音频进行等长分割的方法实现
2020/09/25 Python
详解使用scrapy进行模拟登陆三种方式
2021/02/21 Python
仿酷狗html5手机音乐播放器主要部分代码
2013/05/15 HTML / CSS
现场施工员岗位职责
2014/03/10 职场文书
一体化教学实施方案
2014/05/10 职场文书
课堂打架检讨书200字
2014/11/21 职场文书
2015年党员干部承诺书
2015/01/21 职场文书
小孩不笨观后感
2015/06/03 职场文书
css 中多种边框的实现小窍门
2021/04/07 HTML / CSS
MongoDB日志切割的三种方式总结
2021/09/15 MongoDB
Nginx 匹配方式
2022/05/15 Servers
HTML5页面打开微信小程序功能实现
2022/09/23 HTML / CSS