PHP观察者模式

时间:2014-08-21 19:57:11

标签: php observer-pattern

我刚刚读了一下PHP中的观察者模式。

我已经在某个地方读过观察对象不应该负责通知不同的观察对象,而是被观察对象应该发出观察对象所订阅的单个事件。
这样,观察对象不需要跟踪不同的观察者,而是观察对象应该注册到事件。

有没有办法在PHP中实现这一点?
我已经读过当前的实现方式,即观察对象保持对动态观察者数组的引用。
这不是问题,我只是想知道是否在PHP中,类似于事件发射器'存在。

1 个答案:

答案 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));

http://3v4l.org/Ov24F

玩这个概念,你很快就能掌握它。