如何覆盖 PHP 函数


How to override a PHP function?

Drupal的UberCart在货币方面有一些困难。但是,通过覆盖"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
}

这可能吗?

这似乎是您需要破解核心代码的非常罕见的时刻之一。当涉及到这一点时,我试图像这样将影响限制在最低限度:

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

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

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

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

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