观察者模式的核心是允许你的应用程序注册一个回调,当某个特定的事件发生时便会触发它。实现观察者模式,我们使用一个名为Event的类实现它,这个类有2个公共的方法。
1. registerCallback() :这个方法允许你用规定的名称附加许多回调到一个事件中
2. trigger() :这个方法将会触发刚才命名的事件,并调用该事件已注册的任何回调。
class Event{
static protected $callback = array();
static public function registerCallback($eventName,$callback){
if(!is_callable($callback)){
throw new Exception("Invalid callback");
}
$eventName=strtolower($eventName);
self::$callback[$eventName][]=$callback;
}
static public function trigger($eventName,$data){
$eventName = strtolower($eventName);
if(isset(self::$callback[$eventName])){
foreach(self::$callback[$eventName] as $callback){
$callback($data);
}
}
}
}
注册事件:
class LogCallback{
public function __invoke($data){
echo "Log Data".$data;
echo "__invoke方法使用:当运行脚本试图将对象作为一个方法使用时触发".$data;
}
}
header("Content-Type:text/html; charset=utf-8");
Event::registerCallback('save',new LogCallback());
Event::registerCallback('save',function($data){
echo "匿名函数调用".$data;
echo "接下来触发事件";
});
触发事件:
class MyDataRecord{
public function save(){
Event::trigger('save',"
");
}
}
$evt=new MyDataRecord();
$evt->save();