【问题标题】:PHP observer patternPHP 观察者模式
【发布时间】:2014-08-21 19:57:11
【问题描述】:

我刚刚阅读了一些关于 PHP 中的观察者模式的内容。

我在某处读到,被观察对象不应该负责通知不同的观察对象,而是被观察对象应该发出一个被观察对象订阅的事件。
这样,被观察对象不需要跟踪不同的观察者,而是应该让观察对象注册到事件。

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

【问题讨论】:

  • 如何在 PrestaShop 中实现:模型类在各种方法(添加、删除、.etc)中具有 Hook:exec('eventName') 函数。 Hook::exec 查找正在侦听此事件的其他对象(类)(已注册到此事件)。然后从该表中检索侦听器对象类的列表,并为每个侦听器类调用一个方法(如果 is_callable)-> hookActionName。
  • 这很容易跟踪,只需创建一个具有两个方法的类,一个接受可调用对象和事件的注册函数,以及接受事件并循环注册的可调用对象的通知事件并打电话给他们。
  • 两者似乎都是可行的解决方案。谢谢,确实是要从观察到的对象中删除依赖项。创建一个中间类来管理订阅可以做到这一点。

标签: php observer-pattern


【解决方案1】:

cmets 中的两种解决方案都是相同的,只是措辞不同。

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

玩转这个概念,你会很快掌握它的窍门。

【讨论】:

    猜你喜欢
    • 2016-02-20
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-22
    • 1970-01-01
    • 2013-02-12
    • 1970-01-01
    相关资源
    最近更新 更多