【问题标题】:redeclare a php-function重新声明一个 php 函数
【发布时间】:2013-02-21 10:04:26
【问题描述】:

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

【问题讨论】:

  • 我不知道 php 或任何其他语言中有任何 doesn't work 错误。顺便说一句,你有错字(关闭 ''old_wp_funtion 之后丢失)。
  • 而且 php 还支持namespaces,这是处理函数名称不明确时的常用方法。
  • 我认为您需要更详细地研究您要通过此实现的目标。不管是什么,这听起来都是错误的方法。

标签: php wordpress overloading redeclare


【解决方案1】:

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

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

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

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

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-11
    • 2012-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-12
    • 2016-10-31
    相关资源
    最近更新 更多