PHP没有事件机制。有一些模拟事件的方法,但我觉得代码太繁琐了,不实用。这里我向你推荐PHP的魔术方法。
魔术方法会在调用一个不存在或是非公有的方法之前,自动根据某种规则调用另外一个方法。比如下面的类就是了这样:在调用insert方法时,判断类中是否有before_insert方法。如果有则先调用before_insert方法,并检查它的返回值,决定是否继续调用insert。如果before_insert是一个过滤函数,如果验证失败就会返回false,insert插入就不会进行了。
如果不明白可以阅读PHP手册中介绍魔术方法的部分。
class MyClass{
// 如果使用类的实例调用$method,但$method方法不是公有的,就会触发此函数。
public function __call($method, $args) {
// 检查是否存在方法$method
if (method_exists($this, $method)) {
$before_method = 'before_' + $method;
// 检查是否存在方法$before_method
if (method_exists($this, $before_method)) {
// 调用$before_method,检查其返回值,决定是否跳过函数执行
if (call_user_func_array(array($this, $before_method), $args)) {
retrun call_user_func_array(array($this, $method), $args)
}
} else {
// $before_method不存在,直接执行函数
retrun call_user_func_array(array($this, $method), $args)
}
} else {
throw new Exception('no such method ' . $method);
}
}
// 注意这里不要写成public
private function insert() {}
// 低调!不要写出公有的
private function before_insert() {}
}
$myobj = MyClass;
$myobj->insert('mytable', array('name'=>'2012'));
在写一个自定义函数,在执行方法的时候$this->自定义函数名
执行该方法的时候调用另一个方法