【问题标题】:Observer Pattern Logic Without OOP?没有 OOP 的观察者模式逻辑?
【发布时间】:2011-03-22 08:10:10
【问题描述】:

我正在考虑在我的网站上实现类似于观察者模式的逻辑,以实现挂钩。

我正在寻找类似于Best way to allow plugins for a PHP application的东西

但是那里的代码太有限了,因为我无法将多个挂钩附加到同一个侦听器。

我不知道如何放大该代码以使其能够在一个事件中侦听多个操作。

谢谢

【问题讨论】:

    标签: php design-patterns observer-pattern


    【解决方案1】:

    您可以按照 ircmaxell 的建议进行操作:添加挂钩。但显然,他提供的信息对你来说还不够。

    如果您喜欢通过示例学习,您可以查看 CMS Drupal,它不是 OOP,而是使用观察者模式,在所有地方都称为 hooks,以允许模块化设计。

    钩子的工作原理如下:

    • 一段 php 寻找一个特别命名的函数的存在。
    • 如果存在,调用它并使用它的输出(或者什么都不做)

    例如:

    • 就在一篇文章被保存到 Drupal 之前,文章系统调用 hook_insert
    • 每个具有 ModuleName_insert 名称的函数的模块都会看到该函数被调用。示例:pirate.module 可能有一个函数 pirate_insert()。文章系统沿所有模块进行往返,并查看 ModuleName_insert 是否存在。它将经过pirate 模块并找到pirate_insert()。然后它将调用该函数(并传递一些参数)。因此,允许 pirate.module 在插入之前更改文章(或触发一些操作,例如将正文变为 pirate-speek)。

    魔法发生在所谓的 user_callbacks 中。 An example

    $hook = 'insert'
    foreach (module_implements($hook) as $module) {
      $function = $module .'_'. $hook;
      $result = call_user_func_array($function, $args);
    }
    

    函数module_implements 可能类似于:

    $list = module_list(FALSE, TRUE, $sort); //looks for files that are considered "modules" or "addons".
    foreach ($list as $module) {
      if (function_exists($module.'_'.$hook)) { //see if the module has the hook 'registered'
        $implementations[$hook][] = $module; //if so: add it to a list with functions to be called.
      }
    }
    

    【讨论】:

      【解决方案2】:

      只需添加一个“*”挂钩,并修改hook() 函数以调用命名事件和“*”事件中的所有“挂钩”。

      然后,只需这样做:

      add_listener('*', 'mycallback');
      

      【讨论】:

      • 嗨伙计,我不明白这个?
      • 基本上,创建一个由` * . Then, edit the hook()` 函数标识的新钩子来调用所有这些监听器以及指定名称的监听器......
      【解决方案3】:

      看看Spl_Observer

      您说您不想要 OOP,但您可以轻松实现一个非 OOP 包装器。

      【讨论】:

        猜你喜欢
        • 2016-02-20
        • 2023-04-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-31
        相关资源
        最近更新 更多