Разработчики объектно-ориентированных приложений договорились создавать по одному исходному PHP-файлу для каждого класса. Главная неприятность — приходится в начале каждого скрипта писать длинный список включений, по одному для каждого файла, который требуется загрузить.
Функция spl_autoload_register() регистрирует нужное количество автозагрузчиков для автоматической загрузки классов и интерфейсов, которые пока не определили. Регистрация автозагрузчиков даёт PHP последний шанс загрузить класс или интерфейс, прежде чем скрипт завершит работу с ошибкой.
Все классоподобные конструкции получится загрузить автоматически таким же способом, включая классы, интерфейсы, трейты и перечисления.
До PHP 8.0.0 классы и интерфейсы загружали автоматически функцией __autoload(). Однако это менее гибкая альтернатива функции spl_autoload_register(), а функцию __autoload() объявили устаревшей в PHP 7.2.0 и удалили в PHP 8.0.0.
Замечание:
Функцию spl_autoload_register() разрешается вызывать больше одного раза, чтобы зарегистрировать больше одного автозагрузчика. Если функция автозагрузки выбросит исключение, оно прервёт процесс автозагрузки и не разрешит запускать следующие функции автозагрузки. Поэтому выбрасывать исключения из функции автозагрузки настоятельно не рекомендуется.
Пример #1 Пример автоматической загрузки классов
В этом примере функция пытается загрузить класс MyClass1
из файла MyClass1.php и класс MyClass2
из файла MyClass2.php.
<?php
spl_autoload_register(function ($class_name) {
include $class_name . '.php';
});
$obj = new MyClass1();
$obj2 = new MyClass2();
?>
Пример #2 Другой пример автоматической загрузки классов
В этом примере функция пытается загрузить интерфейс ITest
.
<?php
spl_autoload_register(function ($name) {
var_dump($name);
});
class Foo implements ITest {}
/*
string(5) "ITest"
Fatal error: Interface 'ITest' not found in ...
*/
?>
Пример #3 Пример работы с автозагрузчиком пакетного менеджера Composer
» Composer генерирует файл vendor/autoload.php
,
который настраивается на автоматическую загрузку пакетов,
которыми управляет менеджер зависимостей. Пакеты готовы к работе
сразу после включения файла-автозагрузчика.
<?php
require __DIR__ . '/vendor/autoload.php';
$uuid = Ramsey\Uuid\Uuid::uuid7();
echo "Пакет сгенерировал новый UUID-идентификатор -> ", $uuid->toString(), "\n";
?>