PHP中的事件处理

看下面的事件类

class Event
{
    protected static $listens = array(); 

    /**
     * [listen 注册监听事件]
     * @param [string]   $event    [事件名]
     * @param [callback] $callback [事件内容]
     * @param [bool] $once [是否是一次性事件,默认false]
     */
    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();
        // 将函数名(callback)赋给 $event
        $event = array_shift($args);
        // 检测事件是否被注册过,没有则退出
        if(!isset(self::$listens[$event])) return false;
        foreach( self::$listens[$event] as $index=>$listen){
            $callback = $listen[‘callback‘];
            $listen[‘once‘] && self::remove($event, $index);
            call_user_func_array($callback, $args);
        }
    }
}

这个类包含了事件的注册,触发及移除方法。

下面添加一个事件,事件名叫walk,事件的动作就是输出 "I am walking...n" ,执行后。该事件会存储在 $listens 这个数组中。

Event::listen(‘walk‘, function($a=‘‘,$b=‘‘){
    echo "I am walking...n" .$a .$b;
}); 

触发walk事件

Event::trigger(‘walk‘);

也可以传参数进去

Event::trigger(‘walk‘,‘~~~‘,‘!!!‘); 

如果不移除该事件,触发一次就会执行一次。

而一次性事件执行过一次就会被销毁。再次调用没有任何反应。

Event::one(‘walkOnce‘, function(){
    echo "run...once";
}); 

Event::trigger(‘walkOnce‘,true);

// 因为已经执行过了,再次调用返回了false
Event::trigger(‘walkOnce‘);
时间: 03-06

PHP中的事件处理的相关文章

第38课 Qt中的事件处理(上)

1. GUI程序原理回顾 (1)图形界面应用程序的消息处理模型 (2)思考:操作系统发送的消息如何转变为Qt信号 2. Qt中的事件处理 (1)Qt平台将系统产生的消息转换为Qt事件 ①Qt事件是一个QEvent的对象 ②Qt事件用于描述程序内部或外部发生的动作 ③任意的QObject对象都具备事件处理的能力 (2)GUI应用程序的事件处理方式 ①Qt事件产生后立即被分发到QWidget对象 ②QWidget中的event(QEvent*)进行事件处理 ③event()根据事件类型的不同,调用不

iOS中的事件处理

前言:iOS中事件处理,是一个很重要也很难得地方.涉及到响应者链的地方的面试题,很多工作两三年的老鸟也未必能回答的很专业.这里详细介绍一下iOS中的事件处理,以及响应者链. 1. 三大事件 触摸事件 加速计时间 远程控制事件 2. 响应者对象 在iOS中不是任何对象都能处理事件,只有继承了UIResponder的对象才能接收并处理事件.我们称之为 响应者对象 UIApplication.UIViewController.UIView都继承自UIResponder,因此它们都是响应者对象,都能够接

理解JavaScript中的事件处理 阻止冒泡event.stopPropagation();

原文地址:http://www.cnblogs.com/binyong/articles/1750263.html 这篇文章对于了解Javascript的事件处理机制非常好,将它全文转载于此,以备不时之需. 什么是事件? 事件(Event)是JavaScript应用跳动的心脏 ,也是把所有东西粘在一起的胶水.当我们与浏览器中 Web 页面进行某些类型的交互时,事件就发生了.事件可能是用户在某些内容上的点击.鼠标经过某个特定元素或按下键盘上的某些按键.事件还可能是 Web 浏览器中发生的事情,比如

【转】JavaScript中的事件处理

原文:http://www.cnblogs.com/binyong/articles/1750263.html 什么是事件? 事件(Event)是JavaScript应用跳动的心脏 ,也是把所有东西粘在一起的胶水.当我们与浏览器中 Web 页面进行某些类型的交互时,事件就发生了.事件可能是用户在某些内容上的点击.鼠标经过某个特定元素或按下键盘上的某些按键.事件还可能是 Web 浏览器中发生的事情,比如说某个 Web 页面加载完成,或者是用户滚动窗口或改变窗口大小. 通过使用 JavaScript

理解JavaScript中的事件处理

什么是事件? 事件(Event)是JavaScript应用跳动的心脏 ,也是把所有东西粘在一起的胶水.当我们与浏览器中 Web 页面进行某些类型的交互时,事件就发生了.事件可能是用户在某些内容上的点击.鼠标经过某个特定元素或按下键盘上的某些按键.事件还可能是 Web 浏览器中发生的事情,比如说某个 Web 页面加载完成,或者是用户滚动窗口或改变窗口大小. 通过使用 JavaScript ,你可以监听特定事件的发生,并规定让某些事件发生以对这些事件做出响应. 今天的事件 在漫长的演变史,我们已经告

js中关于事件处理函数名后面是否带括号的问题

今天总结一个关于事件处理程序的小细节.首先回顾一下事件处理的一些概念. JS中的事件处理(事件绑定)就是让某种或某些事件触发某些活动.有两种常见的形式,分别是DOM Level 0 和DOM Level 2.这两种方式最大的区别就在于DOM 0级事件处理只能用于事件冒泡,而DOM 2级事件处理却可以通过设置第三个参数来分别支持事件冒泡和事件捕获. DOM 0级事件处理一般是直接把一个函数分配给一个事件处理程序,既可以在元素中直接分配一个事件处理程序,如方式一所示;也可以在脚本中把函数分配给事件处

详解JavaScript中的事件处理

在漫长的演变史,我们已经告别了内嵌式的事件处理方式(直接将事件处理器放在HTML元素之内来使用),今天的事件,它已是DOM的重要组成部分,遗憾的是,IE继续保留它最早在IE4.0中实现的事件模型,以后的IE版本中也没有做太大的改变,这也就是说IE还是使用的是一种专有的事件模型(冒泡型),而其它的主流浏览器直到DOM级别3规定定案后,才陆陆续续支持DOM标准的事件处理模型——捕获型与冒泡型. W3C规范在DOM级别1中并没有定义任何的事件,直到发布于2000年11月的DOM级别2才定义了一小部分子

ASP.NET中的事件处理

一.ASP.NET中的事件主要支持3个主要的事件组:1.包含在asp.net生成页面时自动生成,我们使用这些事件建立页面(如page_load等)2.包含了用户与页面交互时发生的所有事件(这种最强大)3.html内部的事件,这些事件在浏览器上执行(主要是由javascript来实现). 在C#语言中,事件的处理主要有两种方法:1.委托式事件处理模式(Delegation Event Model)   (VS2003中需要手工建立事件的委托关系,VS2005不需要了.)2.对可重载方法(Event

第三十八课、Qt中的事件处理(上)

一.图形界面应用程序的消息处理模型 二.Qt的事件处理 1.Qt平台将系统产生的消息转换为Qt事件(每一个系统消息对象Qt平台的一个事件) (1).Qt事件是一个QEvent的对象 (2).Qt事件用于描述程序内部或者外部发生的动作 (3).任意的QObject对象都具备事件处理的能力 2.GUI应用程序的事件处理方式 (1).Qt事件产生后立即被分发到QWidget对象 (2).QWidget中的event(QEvent*)进行事件处理 (3).event()根据事件类型调用不同的事件处理函数

谈一谈jquery中的事件处理

①jQuery内置事件函数的两种声明方式 不带参数的事件函数-事件类型名() 模拟了用户的操作 带参数的事件函数-事件类型名(事件函数) $($("#id").click(function(){})) 带参数的事件函数 $($("#id").click(function(){}); $("#id").click();) 不带参数的事件函数-不单击#id也会执行相应函数 即模拟了用户操作 ②jQuery内置事件类型分类 ⑴浏览器相关事件 error