1

WordPress CMS 的正常安装由数百个脚本、插件和主题组成。该概念允许通过简单地创建脚本副本并将更改的版本放在正确的目录中来替换脚本。但是,安装新版本的脚本或插件时,不会更新复制的脚本。在一个脚本中通常有数百个函数。更改一个功能的代价是其他功能也将不再更新。在许多情况下,Wordpress 钩子和过滤器足以添加或抑制特定功能,但并非总是如此。

我正在寻找一种重新声明或重载函数的方法,以便在安装更新时可以将原始脚本替换为 CMS。我试过这个:

rename_function( 'wp_function' , 'old_wp_funtion )

function wp_function(){
        // things to do before the function
    $a = $b;
        // call the old function
    $result = old_wp_function();
        // things to do afterwards
    $b = $c;

    return $result;
}

但它不起作用。此外,使用 Wordpress,您永远不知道要考虑的参数类型和数量。重载的函数也必须处理这个问题。

我的问题是:我如何才能让它在所有情况下都能正常工作,并且可以使用任何数量和任何类型的参数。并且不必对原始函数/脚本进行任何更改,因为它们可能(而且必须)被 Wordpress 更新覆盖。

4

1 回答 1

1

PHP 不支持在声明函数后重新定义函数。有很多方法可以强制它,但总的来说,它被认为是非常糟糕的编程实践,并且强烈建议不要这样做。

如果您真的想在 PHP 中重载代码,最好在类中编写代码而不是在普通函数中编写代码,因为类可以很容易地扩展,并且方法可以重载。到目前为止,这将是您的最佳选择。它可能需要对您的代码进行一些修改,但无论如何在类中编写代码是一种很好的做法,因此请考虑这是一个提高代码质量的机会。

另一种选择是使用命名空间。PHP 5.3 及更高版本支持命名空间,这意味着您可以多次声明相同的函数名,但在不同的命名空间中。如果您的代码当前未使用命名空间,这可能需要大量的工作来实现,但它可能有助于您做您想做的事。但我怀疑我之前提到的班级选项会是一个更好的选择。

具体参考rename_function()您在此处尝试使用的功能:它是称为 ADP 的非标准调试器扩展的一部分;它是开发人员的调试器,因此当然不应该在生产系统中使用。

如果您决定按照您想要的方式进行操作,您可以尝试的其他选项包括Runkit 扩展,它明确设计为允许您完全按照您的要求进行思考。同样,它仅供开发人员使用,不鼓励用于生产。

另一种选择是Patchwork 库,它是纯 PHP 代码(即它不需要安装 PHP 扩展)。这使它成为一个更具吸引力的解决方案。但同样,作者明确建议不要将它用于开发环境以外的任何东西。

所以你有它:你有几个选择。如果您必须按照您描述的路线进行,我建议使用 Patchwork 库。

但我要再说一遍,你所要求的不是一个好主意——重要的线索应该是没有其他人这样做,而那些做类似事情的人一有机会就说它应该'不用于生产。

它被认为是一个有用的工具的唯一情况是编写测试脚本,在这种情况下你有无法避免的依赖关系。将依赖项重新定义为模拟或存根可以为其他无法测试的代码编写单元测试。

但除此之外,来自 PHP 世界的一致信息是:不要重新定义函数。

于 2013-02-21T10:41:57.273 回答