基于事件机制的PHP程序设计

PHP为什么没有内置事件机制?
1. PHP本身是一种脚本语言,他是因web诞生的,这么多年的发展,也是为web而发展的
2. 通过事件可以实现一种设计模式(中介者模式),但是似乎PHP不太讲究模式

下面是从其他语言中借鉴过来的思想,心血来潮才仓促之间写下了下面这些 代码,希望能对各位读者,也对自己能够有些启发:

<?php
/**
 * @brief: 基于事件机制的PHP程序设计
 * @author: phpor <lijunjie1982@yahoo.com.cn>
 * @date: 2009-10-10 14:00:00
 * @version: 1.2
 */
// 修改历史:
// version 1.1: 
//         1. 使用了call_user_func_array函数,大大简化了事件处理,简化了Event类
//         2. 给支持事件的类定义事件参数类
// version 1.2: 
//         1. 添加了事件的默认处理器,否则不绑定事件时会报错

/**
 * @brief: 事件基类,提供事件相关的一些方法
 */
class Event {
    protected 
$_arrEvent = array();

    protected function defaultEventHandler($sender null$misc null) {
        return 
true;
    }

    public function addEventHandler($eventName$handler) {
        if (!isset(
$this->_arrEvent[$eventName]) || !is_callable($handler)) {
            
// 弱类型语言,这里就不报错了
            
return false;
        }     
        
$this->_arrEvent[$eventName] = $handler;
        return 
true;
    }

    protected function triggerEvent($eventName,$args) {
        if(isset(
$this->_arrEvent[$eventName]) ) {
            return 
call_user_func_array($this->_arrEvent[$eventName], array($this,$args));  // 触发事件时,一般第一个参数为sender
        
}
        return 
true;
    }
}
/**
 * @brief: 一个实现了事件机制的表单类
 */
class Form extends Event{
    
    public function 
__construct () {
        
// 这里初始化自己支持的事件
        
$this->_arrEvent = array ("onsubmit"=>array($this,"defaultEventHandler"));  // 注意这里不能初始化为null,null就等于没有isset
    
}
    public function 
submit($action) {
        
// 在执行动作前触发事件
        
if (!$this->triggerEvent("onsubmit",new FormEventArgs(array("action"=>$action)))) return false;
        echo 
"submitedn";
        
// 其实对于有些操作,在执行动作后也可以触发某个事件
        
return true;
    }
}
/**
 * @brief: 一个类如果要支持事件,最好定义一个事件参数类,便于传递自己需要抛出的信息
 */
class FormEventArgs {
    private 
$_arrData = array();

    public function __construct($arrData = array()) {
        
$this->_arrData $arrData;
    }
    public function 
getData() {
        return 
$this->_arrData;
    }
}
/**
 * @brief: 事件处理器可以是一个函数
 */
function handler(Form $formFormEventArgs $args) {
    echo 
get_class($form)."n";
    
print_r($args->getData());
    echo 
"I am return true onsubmit, so form can submitn";
    return 
true;
}

/**
 * @brief: 一个页面类,演示了如何使用实现了事件机制的类
 */
class Page {
    
    public function 
show() {
        
$f = new Form();
        
$f->addEventHandler("onsubmit","handler"); // 这里可以使一个全局函数
        
$f->submit("action.php");
        echo 
"n";
        
$f2 = new Form();
        
$f2->addEventHandler("onsubmit",array($this,"Form_onsubmit"));  // 这里可以使用任意的方法名
        
$f2->submit("action.php");
    }
    
/**
     * @brief: 事件处理器也可以是对象的一个方法
     */
    
public function Form_onsubmit(Form $formFormEventArgs $args) {
        echo 
get_class($form)."n";
        
print_r($args->getData());
        echo 
"I am return false onsubmit, so form can not submitn";
        return 
false;
    }
}

// test
$p = new Page();
$p->show();

?>

相关参考:
http://hi.baidu.com/wwwanq/blog/item/0778458033d417d1bd3e1ed4.html

http://www.phpres.com/html/PHPjichujiaocheng/20080628/1980.html

留下评论

邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据