Что такое автозагрузка; Как вы используете spl_autoload, __autoload и spl_autoload_register?

Я изучаю передовые стандарты PHP и пытаюсь внедрить новые и полезные методы. Раньше я использовал __autoload только для того, чтобы избежать включения нескольких файлов на каждую страницу, но в последнее время я видел подсказку в __autoload manual

Функция spl_autoload_register () предоставляет более гибкую альтернативу для автозагрузки классов. По этой причине использование __autoload () не рекомендуется и может быть устаревшим или удаленным в будущем.

но я действительно не могу понять, как реализовать spl_autoload и spl_autoload_register

spl_autoload_register() позволяет регистрировать несколько функций (или статические методы из собственного класса Autoload), которые PHP будет помещать в стек / очередь и вызывать последовательно, когда объявляется «новый класс».

Так, например:

 spl_autoload_register('myAutoloader'); function myAutoloader($className) { $path = '/path/to/class'; include $path.$className.'.php'; } //------------------------------------- $myClass = new MyClass(); 

В приведенном выше примере «MyClass» – это имя класса, который вы пытаетесь создать, PHP передает это имя как строку в spl_autoload_register() , что позволяет вам выбрать переменную и использовать ее для «включения» соответствующего класс / файл. В результате вам не нужно включать этот класс через оператор include / require …

Просто вызовите класс, который вы хотите создать, как в примере выше, и поскольку вы зарегистрировали функцию (через spl_autoload_register() ), которая будет определять, где находится весь ваш класс, PHP будет использовать эту функцию.

Преимущество использования spl_autoload_register() заключается в том, что в отличие от __autoload() вам не нужно реализовывать функцию автозагрузки в каждом __autoload() файле. spl_autoload_register() также позволяет регистрировать несколько функций автозагрузки, чтобы ускорить автозагрузку и сделать ее еще проще.

Пример:

 spl_autoload_register('MyAutoloader::ClassLoader'); spl_autoload_register('MyAutoloader::LibraryLoader'); spl_autoload_register('MyAutoloader::HelperLoader'); spl_autoload_register('MyAutoloader::DatabaseLoader'); class MyAutoloader { public static function ClassLoader($className) { //your loading logic here } public static function LibraryLoader($className) { //your loading logic here } 

Что касается spl_autoload , в руководстве указано:

Эта функция предназначена для использования в качестве реализации по умолчанию для __autoload() . Если ничего не указано и spl_autoload_register() без каких-либо параметров, то эти функции будут использоваться для последующего вызова __autoload() .

Более практично, если все ваши файлы находятся в одном каталоге, и ваше приложение использует не только файлы .php, но и настраиваемые файлы конфигурации с расширениями .inc, например, одна из стратегий, которую вы могли бы использовать, заключалась бы в том, чтобы добавить каталог, содержащий все файлы на путь включения PHP (через set_include_path() ).
И поскольку вам также нужны ваши файлы конфигурации, вы должны использовать spl_autoload_extensions() чтобы перечислить расширения, которые вы хотите найти PHP.

Пример:

 set_include_path(get_include_path().PATH_SEPARATOR.'path/to/my/directory/'); spl_autoload_extensions('.php, .inc'); spl_autoload_register(); 

Поскольку spl_autoload – это реализация метода магии __autoload() по умолчанию, PHP будет вызывать spl_autoload при попытке создать экземпляр нового класса.

Надеюсь это поможет…

Начиная с PHP 5.3 вы можете использовать spl_autoload_register() с пространствами имен, что означает, что вы можете организовать свой проект и автоматически загружать свои php-классы без каких-либо требований или включать и не переопределять функцию __autoload() .

Чтобы продемонстрировать это поведение, просто создайте файл index.php:

 <?php spl_autoload_register(); var_dump(new Main\Application); 

Затем создайте папку с именем Main, расположенную рядом с файлом index.php. Наконец, создайте файл под названием Application.php, расположенный в Main, и вставьте в него следующий код:

 <?php namespace Main; class Application{}