2013-02-21 108 views
1

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

我正在寻找一种重新声明或重载函数的方法,以便在安装更新时可以用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更新覆盖。

+0

我不知道任何'不工作'错误在PHP或任何其他语言。顺便说一句,你有错字(在'old_wp_funtion'后面关闭''')。 – Leri 2013-02-21 10:08:30

+0

而且php支持[namespace](http://www.php.net/manual/en/language.namespaces.rationale.php),这是处理函数名称不明确时常见的方式。 – Leri 2013-02-21 10:09:49

+0

我认为你需要深入研究你正在努力达到的目标。无论如何,这听起来像是错误的做法。 – Dunhamzzz 2013-02-21 10:24:09

回答

1

PHP不作为标准支持重新定义函数声明后。有很多方法可以强制它,但总的来说它被认为是非常不好的编程习惯,并且非常不鼓励。

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

另一种选择是使用名称空间。 PHP 5.3和更高版本支持名称空间,这意味着您可以多次声明相同的函数名称,但是在不同的名称空间中。如果你的代码目前没有使用名称空间,这可能涉及相当大量的工作来实现,但它可以帮助你做你想做的事情。但我怀疑我之前提到的课程选择是一个更好的选择。

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

如果您决定以您想要的方式进行操作,您可以尝试的其他选项包括Runkit extension,这是明确设计的,可以让您准确地考虑您所问的问题。同样,它仅供开发人员使用,不鼓励用于生产。

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

所以你有它:几种选择存在你。如果你需要沿着你描述的路线继续前进,我建议使用Patchwork库。

但是我会再说一遍,你所要求的并不是一个好主意 - 大的线索应该是没有人这样做,而那些正在做类似事情的人每隔一段时间就会说它不应该用于生产的机会。

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

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