Я знаю, что это было несколько миллиардов раз, но ожидаемые решения - ! 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 вещь, любой способ определить, объявлена ли глобальная функция ?