Задать вопрос

Как узнать, где был вызван автозагрузчик?

Пользуюсь простейшим скриптом автолоадера, которого мне хватает с головой:

namespace {
    function __autoload($class_addr)
    {
        $classes_root = str_replace(['/', '\\'], DIRECTORY_SEPARATOR, $_SERVER['DOCUMENT_ROOT']).
                DIRECTORY_SEPARATOR.'_classes'.DIRECTORY_SEPARATOR;
        $class_addr = str_replace(['/', '\\'], DIRECTORY_SEPARATOR, $class_addr);
        require_once $classes_root.$class_addr.'.php';
    }
}


В клиенте:

require_once $_SERVER['DOCUMENT_ROOT'].DIRECTORY_SEPARATOR.'autoload.php';


Всё работает на ура, но есть одна проблемка: когда в каком-то скрипте неверно прописано имя класса или неймспейс, выскакивает например вот такая ошибка:

Warning: require_once(E:\OpenServer\domains\asoft.local\_classes\Configurator.php): failed to open stream: No such file or directory in E:\OpenServer\domains\asoft.local\autoload.php on line 8


Когда классов и скриптов подключено много - бывает крайне сложно найти, какой именно скрипт запросил класс с неправильным именем.
Можно ли как-то сделать, чтобы этот автолоадер показывал, из какого скрипта он дёргается?
  • Вопрос задан
  • 169 просмотров
Подписаться 2 Оценить Комментировать
Помогут разобраться в теме Все курсы
  • Skillbox
    Веб-разработчик на PHP
    9 месяцев
    Далее
  • Хекслет
    PHP-разработчик
    10 месяцев
    Далее
  • Нетология
    Веб-разработчик с нуля: профессия с выбором специализации
    14 месяцев
    Далее
Решения вопроса 2
@RadialAdmin
Попробуйте www.php.net/debug_backtrace
Ответ написан
Комментировать
Audiophile
@Audiophile Автор вопроса
Достаточно было прописать return null при !file_exists - теперь стандартный обработчик сам пишет, какой класс в каком файле не был найден:

Fatal error: Class 'asoft\menus\mapper\asoft\mapper\Mapper' not found in E:\OpenServer\domains\audiophilesoft.local\_classes\asoft\menus\mapper\Mapper.php on line 5
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
miraage
@miraage
Старый прогер
Если нужен stacktrace - используйте исключения.
Ответ написан
Комментировать
Stalker_RED
@Stalker_RED
Пишем перехватчик ошибок, подключаем:
set_error_handler('my_error_handler');
register_shutdown_function('my_shutdown_func');

и внутри обработчика смотрим трассировку

Для этого во всех крупных фреймворках есть готовые компоненты, можно посмотреть реализацию.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
FoodSoul Калининград
от 180 000 до 250 000 ₽
IT-Spirit Москва
от 230 000 до 320 000 ₽
IT ATLAS Москва
от 250 000 до 500 000 ₽