Открывает ли php class Autoloader файл и проверяет имя класса? Я смотрел, как это происходит на самом деле. Одно я знаю, что он рекурсивный? Если я ошибаюсь, дайте мне знать
Как упоминалось выше: автозагрузчик кратко просматривает Как работает автозагрузчик PHP
Автозагрузчик PHP ищет рекурсивно в определенных каталогах для определения классов, признаков и интерфейсов. Без какой-либо дополнительной конфигурации каталог, в котором находится требуемый файл, будет использоваться в качестве пути по умолчанию.
Имена файлов не должны подчиняться никакому соглашению. Все файлы ищут определения классов. Файлы, похожие на имя класса или конец с .php или .inc, являются предпочтительными. Если поддерживается, PHP Tokenizer будет использоваться для надежного определения определения класса.
Автозагрузчик PHP – это всего лишь механизм включения файла при построении класса .
Если вы поместите все свои классы в 1 файл, вам не нужен автозагрузчик. Конечно, при программировании OO вы даете каждому классу свой собственный файл, и именно там появляется автозагрузчик.
Некоторые примеры:
class AutoLoader { public function __construct() { spl_autoload_register( array( $this, 'ClassLoader' )); } public function ClassLoader( $class ) { if( class_exists( $class, false )) return true; if( is_readable( 'path_to_my_classes/' . $class . '.php' )) include_once 'path_to_my_classes/' . $class . '.php' } } $autoloader = new AutoLoader();
Здесь происходит то, что при создании класса автозагрузчика метод класса Classloader регистрируется как автозагрузчик.
Когда создается новый класс, сначала метод Classloader проверяет, загружен ли файл для класса. Если нет, класс добавляется к пути и расширяется с расширением. Если файл доступен для чтения, он включен.
Конечно, вы можете сделать это очень сложным. Давайте посмотрим на пример с пространствами имен и с картографом. Предположим, что мы находимся в классе автозагрузчика:
private $mapper array( 'Foo' => 'path_to_foo_files/', 'Bar' => 'path_to_bar_files/'); public function ClassLoader( $class ) { if( class_exists( $class, false )) return true; // break into single namespace and class name $classparts = explode( '\\', $class ); $path = $this->mapper[$classparts[0]]; if( is_readable( $path . $classparts[1] . '.php' )) include_once $path . $classparts[1] . '.php' }
Здесь имя класса является splittet в части пространства имен и части имени класса. Часть пространства имен просматривается в массиве mapper, и этот путь затем используется как путь включения для файла php.
Это просто примеры, демонстрирующие, что можно сделать с автозагрузчиком. Для производства требуется еще одна работа, например, проверка ошибок.