Я изучаю передовые стандарты 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{}