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

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

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


Когда классов и скриптов подключено много - бывает крайне сложно найти, какой именно скрипт запросил класс с неправильным именем.
Можно ли как-то сделать, чтобы этот автолоадер показывал, из какого скрипта он дёргается?
  • Вопрос задан
  • 167 просмотров
Решения вопроса 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');

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

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

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

Похожие вопросы