PHP: <?php namespace core; class App { use a; } Раз (всё нормально - нужная ошибка) PHP: <?php use core\App; chdir('..'); spl_autoload_register(fn($class) => include strtr("$class.php", '\\', '/')); register_shutdown_function(fn() => var_dump(error_get_last()['message'])); // Trait 'core\a' not found new App(); Два (не совсем та ошибка) PHP: <?php use core\App; chdir('..'); spl_autoload_register(fn($class) => require strtr("$class.php", '\\', '/')); register_shutdown_function(fn() => var_dump(error_get_last()['message'])); // require(): Failed opening required 'core/a.php' (include_path='.:/usr/share/php') new App(); Мне нужно - Trait 'core\a' not found, оно вылетает при include, НО мне нужен require, мне на include проверку повесить? Но тогда при отстутствии файла будет белый экран, как я эту ошибку узнаю? По сообщению, что класс не найден? А откуда я узнаю он не найден или его вообще не существует ))) Суть: пилю глобальный обработчик, НО Throwable не ловит все ошибки, например, несуществующий трейт он не ловит - это неперехваченная, поэтому register_shutdown_function().
Потому что путь к фаилам относительный и в зависимости где ты его используешь, он разный. Пропиши абсолютный путь. Держи моего динозавра. 5 лет стабильной работы на 2х проектах. Потом перешел на composer и понял что занимался хернёй Спойлер: Динозавр PHP: <?php class Autoloader { static public function loader($className) { $parts = explode('\\', $className); $name = array_pop($parts); $path = implode('/', $parts); $true_path = <путь до папки>. $path . '/' . $name . '.php'; // var_dump($true_path); if ( file_exists($true_path) ) { require_once($true_path); if ( class_exists($className) ) { return TRUE; } } return FALSE; } } spl_autoload_register('Autoloader::loader');