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()