Использование функции существует и требуется один раз - STILL Фатальная ошибка: ранее объявлено - PullRequest
0 голосов
/ 23 января 2020

Я знаю, что это было несколько миллиардов раз, но ожидаемые решения - ! function_exists() и require_once() - не работают. Вопрос в том (и я много занимался поиском), есть ли способ определить в данной точке выполнения, если функция объявлена ​​, но не существует?

Почти бессмысленно печатать, но это то, что происходит. Детали:

Вот что у нас есть и куда бросается смертельный:

if (! function_exists('some_function')) {
   require_once('file-containing-the-function.php');
}
Fatal error: cannot redeclare some_function, previously declared in file-containing-the-function.php on line XX . . . .

Можно подумать, что комбинация function_exists() и require_once() (или include_once, пробовал это также предотвратило бы эту проблему, но в этой среде это не так.

Самый проницательный фрагмент, который я нашел, был в этом комментарии :

A PHP функция может не существовать, но все еще объявлена.

Отсюда мой вопрос, на который, похоже, нет хорошего ответа (кроме правильной перестройки всей системы, которая не выполняется случиться в ближайшее время.)

Это огромная устаревшая система с глобальными переменными и функциями повсюду. Там нет пространств имен и очень мало классов, много мест для вещей, которые могут ошибаться go. Я знаю, что проблема кроется где-то в этой проблеме - file-containing-the-function.php включен во включаемое включение и т. Д., Много уровней глубоко (трассировка стека даже не показывает это). Тем не менее, по всему описанию, определению и множеству ответов на SO обертки должны работать.

С точки зрения этого кода он не появляется в get_defined_functions(). Все глобально и на высшем уровне, внутри функций нет никаких функций или каких-либо обычных подозреваемых, например, пропущенное дополнительное включение. require_once() также применяется в других файлах, где file-containing-the-function.php включено. Файлы get_included_files () не показывают, что файл file-containing-the-function.php даже был включен в момент выполнения этого кода.

Файл, в котором находится этот код, является самим включением и наследует some_function() от другого включения где-то еще , Я не могу переместить включение этого файла или этого кода вверх по стеку вызовов достаточно далеко, чтобы гарантировать, что это будет выполнено первым (и если бы я это сделал, это сломало бы много других вещей). Этот код должен содержать там, где он есть делает, поскольку этот конкретный файл может быть включен без включения file-containing-the-function.php. Например, это может быть среди 20 или 30 других включений в практическом использовании для вывода веб-страницы, но при модульном тестировании включается только этот файл.

Это такой простой и базовый c вещь, любой способ определить, объявлена ​​ли глобальная функция ?

1 Ответ

1 голос
/ 23 января 2020

Я не совсем уверен, что происходит, потому что сообщение об ошибке подразумевает, что файл требуется несколько раз, даже если вы использовали require_once. Весь смысл _once версий require и include состоит в том, чтобы предотвратить переопределения.

Вместо того, чтобы ставить оператор if вокруг require_once, поместите его в file-containing-the-function.php, а затем используйте require_once безоговорочно.

if (!function_exists('some_function')) {
    function some_function(...) {
        ...
    }
}
...