Экземпляр Joomla содержит тысячи исходных файлов PHP с сопоставимым количеством классов PHP. очевидно, что непрактично выполнять require из каждого исходного файла, чтобы интерпретатор PHP знал обо всех классах. Как же тогда Joomla может избежать получения фатальной ошибки PHP Class not found при попытке доступа к классу, который интерпретатор PHP не распознает? Ответ заключается в том, что он использует автозагрузку класса .

При инициализации Joomla настраивает (в libraries/loader.php setup()) ряд автозагрузчиков, например:

spl_autoload_register(['JLoader', 'loadByPsr']);

Если интерпретатор PHP встретит строку, такую как:

if (class_exists($classname)) ...

и он не распознает имя класса, тогда он передаст имя класса зарегистрированному автозагрузчику и вызовет, например

loadByPsr($classname)

передаем имя класса. Начиная с Joomla 4, это должно быть полное имя класса.

В обязанности автозагрузчика входит попытка найти исходный файл, содержащий этот класс, и выполнить include_once на нем, чтобы PHP затем узнал об этом классе. Для компонентов, модулей и плагинов (как для Joomla, так и для расширений сторонних производителей) Joomla использует метод PSR4 для сопоставления имен классов с исходными файлами.

Во время инициализации Joomla просматривает каталоги компонентов, модулей и подключаемых модулей как для сайта, так и для администратора, чтобы найти все XML-файлы манифеста. Затем он загружает XML и ищет <namespace> элементы, и из этих элементов создает набор сопоставлений префиксов пространства имен с каталогами. Поскольку это требует довольно большой работы, результат кэшируется в administrator/cache/autoload_psr4.php - продолжайте и взгляните на это!.

Тот самый loadByPsr затем функция использует это сопоставление и правила PSR4 для поиска исходных файлов, описанные в разделе Поиск классов с помощью PSR4 , чтобы определить имя файла, который должен содержать этот класс. Он проверяет, существует ли файл, и если да, то выполняет include_once по нему и возвращается.

Если автозагрузчик loadByPsr функция успешно нашла класс, затем PHP обрабатывает class_exists($classname) выражение, как сейчас true, и продолжает код вниз. Если это не удалось, то PHP создает исключение class not found .

В Joomla есть ряд функций автозагрузчика - не все классы загружаются с помощью PSR4. Например, все классы библиотек имеют отображение FQN на отдельный исходный файл для этого класса - ознакомьтесь с ним libraries/vendor/composer/autoload_classmap.php.

Существует также сопоставление (в libraries/classmap.php) старых имен глобальных библиотек, начинающихся с J (например, JModelAdmin), с эквивалентами FQN, но это исчезает в Joomla 6.