如何覆盖 PHP 函数?

How to override a PHP function?

UberCart for Drupal 在处理货币方面存在一些困难。但是,通过重写 "uc_currency_format",您至少可以进行一些后台计算,以便对转换后的值有一个很好的估计。但是,由于它是 UberCart Core 的一部分,您无法编辑文件,因此每次更新后都有丢失代码的风险。还有,这个函数没有钩子!

这意味着我唯一能想到的处理方法是拥有一个重写该函数的模块。所以我的问题是...

有没有办法覆盖现有的 PHP 函数?例如,我有:

function uc_currency_format($value, $sign = TRUE, $thou = TRUE, $dec = NULL) 
{
    // dont do this
}

但是当它被调用时,我希望它改为执行这个

function uc_currency_format_rewrite($value, $sign = TRUE, $thou = TRUE, $dec = NULL) 
{
    // do this
}

这可能吗?

不可以覆盖 PHP 中的函数。 Drupal 7 不在模块中使用 Zend(rename_function()override_function())或 OOP。所以你只能向维护者要一个新的钩子。 也许你可以写一个补丁,提供这个钩子,让维护者实现它。

这似乎是您需要破解核心代码的极少数情况之一。 谈到这一点,我尽量将影响限制在最低限度,如下所示:

  • 重命名原始函数。在你的情况下,你会选择 'uc_currency_format_ORIGINAL'
  • 在您的自定义模块中,将您的 'uc_currency_format_rewrite' 重命名为 'uc_currency_format'

这样,您将拥有自己的代码运行。

在下次更新时,您将在测试环境中看到(在将更新应用到生产站点之前最好先进行测试)重复的函数名称致命错误。如果你的钩子还没有实现,你将重新命名原来的函数。

当然,此方法未在最佳实践中定义。使用它需要您自担风险。