如何覆盖PHP函数?

时间:2016-01-27 11:09:13

标签: php drupal-7 ubercart

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
}

这可能吗?

2 个答案:

答案 0 :(得分:3)

这似乎是您需要破解核心代码的极少数时间之一。 谈到这一点,我试着将影响限制在最低限度:

  • 重命名原始功能。在你的情况下,你会选择像' uc_currency_format_ORIGINAL'
  • 这样的东西。
  • 在您的自定义模块中,重命名您的' uc_currency_format_rewrite'进入' uc_currency_format'

这样,您就可以运行自己的代码了。

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

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

答案 1 :(得分:2)

不可以在PHP中覆盖一个函数。 Drupal 7在模块中不使用Zend(<?xml version="1.0" encoding="UTF-8"?> <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://tempuri.org/"> <SOAP-ENV:Body><?xml version="1.0" encoding="UTF-8"?> <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tem="http://tempuri.org/" xmlns:com="http://schemas.datacontract.org/2004/07/Commun.Metier"> <soapenv:Header/> <soapenv:Body> <tem:SendData> rename_function())或OOP。所以你只能向维护者询问一个新钩子。 也许你可以写一个补丁,它提供了这个钩子并要求维护者实现它。