У меня есть проект PHP, который загружает загрузочный файл с именем custom_funcs.php
, который находится в корневом веб-каталоге. Этот файл содержит кучу функций, определяет несколько констант и выполняет следующие действия:
require dirname( __DIR__ ) . '/lib/php/vendor/autoload.php';
spl_autoload_register( function ($class_name) { include __DIR__ ."/classes/$class_name.php"; });
set_include_path( get_include_path() . PATH_SEPARATOR . SITEROOT );
Эта первая строка загружает автозагрузчик Composer. (Обратите внимание, что библиотеки композитора расположены вне корневого веб-каталога). Вторая строка сообщает моему коду, где искать нераспознанные классы, чтобы мне не приходилось постоянно вручную загружать какой-либо файл класса, который я когда-либо использовал. Третья строка добавляет веб-корень в PATH PHP.
Это прекрасно работает вместе с несколькими пакетами Composer уже пару лет.
Затем... Я установил PhpUnit. В целом у меня все работает нормально, за исключением случаев, когда я запускаю тесты:
- Если ошибок нет, то работает нормально.
- Если есть ошибка, я также получаю предупреждения PHP:
Warning: include(C:\...path_to_web_root.../classes/SebastianBergmann\Invoker\Invoker.php): failed to open stream: No such file or directory in C:\...path_to_web_root...\common_funcs.php on line 14
Warning: include(): Failed opening 'C:\...path_to_web_root.../classes/SebastianBergmann\Invoker\Invoker.php' for inclusion (include_path='xxxxxxx') in C:\...path_to_web_root...\common_funcs.php on line 14
Итак, PhpUnit пытается автоматически загрузить класс Invoker, но код использует мой собственный путь автозагрузки, заданный spl_autoload_register
.
Есть ли способ исправить это? Это ошибка в PhpUnit?
Я могу скрыть ошибку, используя «@» перед строкой включения, но я стараюсь любой ценой избегать @hiding ошибок
Примечание. Я загружаю custom_funcs.php
перед тестированием через:
public static function setUpBeforeClass(): void {
require 'common_funcs.php';
}
Структура файла может сделать это более понятным:
c:/some_path/
..lib/
....php/
......vendor/
........(third-party Composer libraries)
..webroot/
....custom_funcs.php
....classes/
......(namespace)/
........(my custom classes)
Я использую пространство имен: MyCompany\Portal
. Итак, мои пользовательские классы находятся в <webroot>/classes/MyCompany/Portal/
custom_funcs.php
— это не что иное, как связный осмысленный класс Object — это набор многократно используемых функций, которые я использую на всем сайте. - person Stephen R   schedule 26.07.2019