Autoloading Classes
Оновлено: 12.05.2023
Багато розробників, які пишуть об'єктно-орієнтовані програми, створюють по одному вихідному файлу 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 і MyClass2 з файлів MyClass1.php і 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 ...
*/
?>
unserialize() unserialize_callback_func unserialize_max_depth spl_autoload_register() spl_autoload() __autoload()