如何覆盖 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'
这样,您将拥有自己的代码运行。
在下次更新时,您将在测试环境中看到(在将更新应用到生产站点之前最好先进行测试)重复的函数名称致命错误。如果你的钩子还没有实现,你将重新命名原来的函数。
当然,此方法未在最佳实践中定义。使用它需要您自担风险。
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'
这样,您将拥有自己的代码运行。
在下次更新时,您将在测试环境中看到(在将更新应用到生产站点之前最好先进行测试)重复的函数名称致命错误。如果你的钩子还没有实现,你将重新命名原来的函数。
当然,此方法未在最佳实践中定义。使用它需要您自担风险。