В PHP у меня есть функция, которая устанавливает автозагрузчики в зависимости от того, какой дочерний сайт выбран в родительском сайте.
Сброс автопогрузчиков идет отлично с spl_autoload_unregister
функция.
Однако, что я замечаю, так это то, что когда я загружаю файл класса, который уже был инициирован до дочернего сайта, этот «старый» файл класса все еще используется после сброса автозагрузчиков.
Пример:
Загрузка родительского сайта example\namespace\RouterClass
от c:\parent\site\RouterClass
Затем я сбрасываю все автозагрузчики и запускаю дочерний сайт и устанавливаю правильные автозагрузчики для дочернего сайта.
Затем дочерний сайт загружается example\namespace\RouterClass
но вместо того, чтобы получить этот файл через новый автозагрузчик из c:\child\site\RouterClass
он получает класс из старого файла, как определено родительским сайтом.
Я вижу класс, зарегистрированный через функцию:
get_declared_classes()
Но я не могу сбросить этот список переменных. Если сброс этого кэша классов возможен, тогда PHP должен начать новый поиск для этого RouterClass
и проверит автозагрузчик дочернего сайта, чтобы найти его.
Второй вариант, который я проверял, был runkit_method_redefine
, но не существует аналогичной функции для таких классов, как runkit_class_redefine
,
У кого-нибудь есть идеи как сбросить объявленный список классов? Или как добиться вышеупомянутого без переименования всех пространств имен дочернего сайта.
Невозможно. Как только класс объявлен, он там навсегда.
Если вам нужно определить автозагрузчики динамически, это необходимо сделать до загрузки любого из затронутых классов.
Других решений пока нет …