我刚刚读了一下PHP中的观察者模式。
我已经在某个地方读过观察对象不应该负责通知不同的观察对象,而是被观察对象应该发出观察对象所订阅的单个事件。
这样,观察对象不需要跟踪不同的观察者,而是观察对象应该注册到事件。
有没有办法在PHP中实现这一点?
我已经读过当前的实现方式,即观察对象保持对动态观察者数组的引用。
这不是问题,我只是想知道是否在PHP中,类似于事件发射器'存在。
答案 0 :(得分:1)
评论中的两个解决方案都是相同的,只是措辞不同。
class Observer {
static protected $events = array();
static public function register($callable, $event){
if (!isset(self::$events[$event])) {
self::$events[$event] = array();
}
self::$events[$event][] = $callable;
}
static public function notify($event, $params = array()) {
if (isset(self::$events[$event])) {
foreach (self::$events[$event] AS $callable){
call_user_func_array($callable, $params);
}
}
}
}
function print_meta($p1, $p2) {
echo $p1 . ' ' . $p2 . PHP_EOL;
}
function multiply_meta($p1, $p2) {
echo $p1 * $p2 . PHP_EOL;
}
function add_meta($p1, $p2) {
echo $p1 + $p2 . PHP_EOL;
}
Observer::register('print_meta', 'event1');
Observer::register('multiply_meta', 'event1');
Observer::register('print_meta', 'event2');
Observer::register('add_meta', 'event2');
Observer::register('multiply_meta', 'event3');
Observer::register('add_meta', 'event3');
echo "Notifying of event 1" . PHP_EOL;
Observer::notify('event1', array(1, 2));
echo "Notifying of event 2" . PHP_EOL;
Observer::notify('event2', array(3, 4));
echo "Notifying of event 3" . PHP_EOL;
Observer::notify('event3', array(5, 6));
玩这个概念,你很快就能掌握它。