Что такое __autoload() в PHP?

Ответ

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

Вроде удобно, да? Ан нет, чувак. Потому что подвохи тут, как говна за баней.

Почему от этой хуйни все давно отказались:

  1. Она устарела, как ламповый телевизор. В PHP 7.2 на неё начали материться в логах, что она deprecated. А в PHP 8.0 её просто выкинули на мороз, накрыли медным тазом. Используешь — получишь фаталку и сам от себя охуеешь.
  2. Одна на весь скрипт. Это пизда рулю. Представь: у тебя в проекте и свои классы есть, и библиотеки сторонние. А __autoload() можно объявить только одну, блядь! Как тебе такая картина? Либо ты под свои классы пишешь логику, либо под чужие. Или начинаешь городить в одной функции адский спагетти-код с кучей if-else. Терпения ноль, ебать.
  3. Пришёл более крутой пацан. И зовут его 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 модем с пищалкой. Технически возможно, но нахуя?