重新声明一个php函数

时间:2013-02-21 10:04:27

标签: php wordpress overloading redeclare

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更新覆盖。

1 个答案:

答案 0 :(得分:1)

PHP不会作为标准支持在声明函数后重新定义函数。有很多方法可以强迫它,但总的来说,它被认为是非常非常糟糕的编程习惯,并且强烈反对。

如果你真的想在PHP中重载代码,那么在类而不是普通函数中编写代码要好得多,因为类可以很容易地扩展,方法也会重载。这将是到目前为止最适合您的选择。可能需要对代码进行一些修改,但最好还是在类中编写代码,因此请考虑提高代码质量。

另一个选择是使用命名空间。 PHP 5.3及更高版本支持名称空间,这意味着您可以多次声明相同的函数名,但是在不同的名称空间中。如果您的代码当前没有使用命名空间,则可能需要执行相当多的工作,但它可能有助于您执行所需的操作。但我怀疑我之前提到的课程选项会更好。

具体参考您在此处尝试使用的rename_function()函数:它是a non-standard debugger extension called ADP的一部分;它是开发人员的调试器,因此当然不应该在生产系统中使用。

如果你决定按照你想要的方式去做,你可以尝试的其他选项包括Runkit extension,它明确地设计为允许你提出的那种想法。同样,它仅供开发人员使用,不鼓励生产使用。

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

所以你有它:有几种选择。如果您必须沿着您所描述的路线前进,我建议您使用Patchwork库。

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

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

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