Drupal 7 — Как переопределить функцию PHP?

У 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
}

Это возможно?

1

Решение

Кажется, это один из тех очень редких случаев, когда вам нужно взломать основной код.
Когда дело доходит до этого, я стараюсь ограничить воздействие как минимум так:

  • Переименуйте оригинальную функцию. В вашем случае вы бы использовали что-то вроде ‘uc_currency_format_ORIGINAL’
  • В вашем пользовательском модуле переименуйте ваш uc_currency_format_rewrite в uc_currency_format

Таким образом, у вас будет собственный код.

При следующем обновлении вы увидите в своей среде тестирования (всегда лучше тестировать перед применением обновлений на рабочих сайтах) фатальную ошибку с дублированием имени функции. Если ваш хук еще не реализован, вы снова переименуете исходную функцию.

Этот метод не определен в лучшей практике, конечно. Используйте его на свой страх и риск.

3

Другие решения

Нет, невозможно переопределить функцию в PHP. Drupal 7 не использует Zend (rename_function(), override_function()) или ООП в модулях. Таким образом, вы можете только попросить у сопровождающего новый крючок.
Возможно, вы могли бы написать патч, который предоставляет этот хук, и попросить сопровождающего его реализовать.

2

По вопросам рекламы [email protected]