【问题标题】:Plugin Architecture in PHPPHP 中的插件架构
【发布时间】:2011-01-19 21:26:22
【问题描述】:

我正计划研究如何在 PHP 中实现插件架构。我曾尝试在网络上搜索可能的参考资料,但我认为如果我在这里询问,也许我对好的参考资料的搜索会更快、更相关。

这里有没有人尝试过在 Web 项目中使用插件架构?

谢谢, 欧文

【问题讨论】:

    标签: php architecture plugins


    【解决方案1】:

    我已经编写了 wordpress 插件,它们所依赖的魔法是“变量函数名称”。例如这是有效的 php,其中将调用函数调用 phpinfo():

    $func_name="phpinfo";
    $func_name();
    

    这允许开发人员“挂钩”函数调用,就像在不更改应用程序的其余部分的情况下用自己的函数覆盖它们一样。 Linux 内核模块都是关于“挂钩”的,如果没有这种行为,它们将无法工作。

    不幸的是,PHP 变量函数名称是一种令人作呕的 hack,它会消耗大量资源。名称空间中的所有函数都放在一个列表中,并且必须在调用该函数之前搜索该列表,这是 O(log2(n))。还请记住,尽管代码仍将转换为有效的 C++,但在 HipHop 中无法正确加速变量函数名称。更好的方法是像在 python 中那样重新声明函数,这将是 O(1) 复杂度,但是 PHP 开发团队讨厌这个想法(是的,我已经要求这个功能了! )。

    祝你好运!

    【讨论】:

    • 这是一种可怕的方法 IMO。
    • @davr:为什么?只要这是明确的和记录的,并且很明显这是正确的行为,它就完全没问题。在类比中,它与委托(在 C# 中)相同。
    • @davr 如果你能想出一个更好的解决方案,整个 PHP 社区都希望听到。
    • 实际上,有时我会在必要时在代码中使用变量函数名称。我不知道它在插件架构方面也很有用。谢谢你们的信息。 @davr 我只是好奇,你对如何在 PHP 中实现这个架构还有其他建议吗?
    【解决方案2】:

    您可以看看 Zend Framework 如何实现他们的Plugin Loader 组件。

    基本上,您将路径设置为存储插件的位置,加载器会尝试加载以 LIFO 方式找到的第一个插件。

    【讨论】:

      【解决方案3】:

      这两个类呢

      1. 插件处理程序/加载程序
      2. 插件

      还有一些规则

      1. 插件处理程序/加载程序是一个单例类,管理插件类的所有子类。
      2. 任何插件都必须继承自插件类。
      3. 插件类将具有可以被其子类覆盖的预定义属性和方法,因此可以使用替代方法来挂钩系统(但我不确定结果是否有任何重大差异)。

      例如说 Plugin 类有一个 url_routes 属性,默认值为空数组,子类可以覆盖并添加任何需要的 url 到这个数组中。

      Plugin Handler/Loader 会将这些 url 路由从子类添加到底层系统。

      【讨论】:

        【解决方案4】:

        不要忘记函数 __autoload。您可以动态加载组件。 喜欢:

        SomeModule::test();
        
        function __autoload($class)
        {
           $class = preg_replace('/^\W/', '', strtolower($class));
           include 'modules/'.$class.'.php';
        }
        

        【讨论】:

          【解决方案5】:

          有很多概念可以被视为“插件”。您可以使用以下方式编写插件系统:

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-04-28
            • 2023-04-03
            • 2011-05-24
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多