【问题标题】:How to override a PHP function?如何覆盖 PHP 函数?
【发布时间】:2016-05-04 07:16:58
【问题描述】:

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 ubercart


【解决方案1】:

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

  • 重命名原始函数。在你的情况下,你会选择像“uc_currency_format_ORIGINAL”这样的东西
  • 在您的自定义模块中,将您的“uc_currency_format_rewrite”重命名为“uc_currency_format”

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-21
      • 2012-10-16
      • 2020-07-13
      • 1970-01-01
      相关资源
      最近更新 更多