Ответ
__autoload() — это устаревшая магическая функция в PHP, которая автоматически загружает файл с определением класса при первой попытке его использования, если этот класс ещё не был объявлен.
Пример использования:
function __autoload($className) {
require_once __DIR__ . '/classes/' . $className . '.php';
}
// При создании объекта, если класс MyClass не определён,
// будет вызвана __autoload('MyClass')
$obj = new MyClass();
Ключевые недостатки и современная альтернатива:
- Устаревание: Функция объявлена устаревшей в PHP 7.2 и полностью удалена в PHP 8.0.
- Однообразие: В скрипте можно определить только одну функцию
__autoload(), что ограничивает гибкость. - Стандарт: Сейчас следует использовать
spl_autoload_register(), который позволяет зарегистрировать несколько автозагрузчиков и создавать более сложные схемы автозагрузки, соответствующие PSR-4.
Современный вариант с spl_autoload_register:
spl_autoload_register(function ($className) {
$file = __DIR__ . '/src/' . str_replace('\', '/', $className) . '.php';
if (file_exists($file)) {
require_once $file;
}
}); Ответ 18+ 🔞
А, блядь, __autoload()! Ну это же классика, ёпта, как старый дедовский москвич — вроде и ездил когда-то, но сейчас на него смотреть страшно, а пытаться завести — так вообще пиздец.
Вот смотри, раньше, в дремучие времена, когда PHP был молодой и зелёный, была такая волшебная палочка. Называлась __autoload(). Суть проще пареной репы: пишешь ты, допустим, new MyClass(), а этот класс нихуя не подключен. Раньше бы тебе скрипт нахуй сломался с фатальной ошибкой. А тут — раз! — срабатывает магия, вызывается твоя функция __autoload(), она получает имя класса и сама, хитрая жопа, подгружает нужный файлик. Красота же!
function __autoload($className) {
require_once __DIR__ . '/classes/' . $className . '.php';
}
// Пытаемся создать объект, класс не объявлен — но не беда!
// Вызовется __autoload('MyClass'), файл подгрузится, и всё заведётся.
$obj = new MyClass();
Вроде удобно, да? Ан нет, чувак. Потому что подвохи тут, как говна за баней.
Почему от этой хуйни все давно отказались:
- Она устарела, как ламповый телевизор. В PHP 7.2 на неё начали материться в логах, что она deprecated. А в PHP 8.0 её просто выкинули на мороз, накрыли медным тазом. Используешь — получишь фаталку и сам от себя охуеешь.
- Одна на весь скрипт. Это пизда рулю. Представь: у тебя в проекте и свои классы есть, и библиотеки сторонние. А
__autoload()можно объявить только одну, блядь! Как тебе такая картина? Либо ты под свои классы пишешь логику, либо под чужие. Или начинаешь городить в одной функции адский спагетти-код с кучейif-else. Терпения ноль, ебать. - Пришёл более крутой пацан. И зовут его
spl_autoload_register(). Вот это уже овердохуища по удобству. Он позволяет навесить сколько угодно автозагрузчиков — хоть десять, хоть сто. Каждый может отвечать за свою логику. И главное — это теперь стандарт де-факто, все нормальные библиотеки и фреймворки на этом живут, по PSR-4.
Вот как сейчас, по-взрослому, делают:
spl_autoload_register(function ($className) {
// Меняем обратные слеши на прямые, чтоб путь на любых системах работал
$file = __DIR__ . '/src/' . str_replace('\', '/', $className) . '.php';
// Проверяем, есть ли файл вообще, чтоб не получить warning
if (file_exists($file)) {
require_once $file;
}
});
Короче, суть в чём: __autoload() — это музейный экспонат. Знать про неё надо, чтобы старый код понимать, если вдруг на такой подпишешься. Но в своём новом коде использовать её — это всё равно что пытаться выйти в интернет через dial-up модем с пищалкой. Технически возможно, но нахуя?