2017-01-23 1 views
1

Я использую WooCommerce на Wordpress 4.7.1. Раньше я выполнял 4.7.0. Когда Wordpress автоматически обновляется до 4.7.1, я вдруг начал видеть, что проверки не перенаправляются на страницу «Спасибо», и пользовательский интерфейс показал, что произошла фатальная ошибка.PHP Невозможно переопределить функцию/вызвать неопределенную функцию

Включение отладки показало следующее сообщение об ошибке:

PHP Fatal error: Cannot redeclare get_cc() (previously declared in .../templates/emails/email-addresses.php:36) in .../templates/emails/email-addresses.php on line 36

Я также подтвердил, что этот файл никогда напрямую вызывается с require, require_once, include или include_once. Это, однако, вызвано с wc_get_template().

Быстрый поиск привел меня к this similar question. Поэтому я добавил следующее к электронной почте-addresses.php:

if (!function_exists('get_cc')) { 
    function get_cc($code) { 
     ... function body 
    } 
} 

После внесения этих изменений, я теперь получить следующее сообщение об ошибке в журнале отладки:

PHP Fatal error: Call to undefined function get_cc() in .../templates/emails/email-addresses.php on line 32

Это означает, что по какой-либо причине, PHP считает, что функция get_cc уже существует, но в то же время она не определена.

Я не был оригинальным разработчиком. Я взял на себя проект от подрядчика, которого нет в наличии. Понятно, что этот файл сильно модифицирован из оригинала. Я уверен, что значение, возвращаемое функцией, должно быть сохранено, поэтому я не могу просто прокомментировать вызов.

Учитывая приведенную выше информацию, какие варианты я должен решить или решить эту проблему?

+0

Определение функции находится внутри этого оператора, однако весь оператор фактически следует за вызовом функции (строка 36 - это начало определения, а вызов - в строке 32). – vbnet3d

ответ

1

Оказывается, что, в отличие от стандартного определения функции в PHP, определения функций, завернутое в if (!function_exists('function_name')) { ... } блока должен предшествовать вызов этой функции.

В этом случае определение функции (строка 36) следует за вызовом (строка 32). Это вызвало функцию появляться в PHP, как определено:

// Not working! 
$value = get_cc($code); 

if (!function_exists('get_cc')) { 
    function get_cc($code) { 
     ... 
    } 
} 

Переключение порядка, так что определение функция пришел первый исправили проблему:

// Working! 
if (!function_exists('get_cc')) { 
    function get_cc($code) { 
     ... 
    } 
} 

$value = get_cc($code); 

Как прямо сейчас, документация PHP, не упомянуте этот вопрос.