@dasauser
Пишу на PHP

По какому принципу работает autoload в composer?

Пишу свой автозагрузчик.
Хочу понять, по какому принципу работает автозагрузчик в composer.
Пока что сделал так:
1. glob(*.php)
2. foreach {require file}
А как это работает в composer?
Что под капотом? Как реализовано подключение файлов? Где посмотреть код?
Он просто смотрит в json file и тянет все значения полей autoload, а потом подключает по ним все файлы?
Или же он как то понимает, какие файлы нужно подключить?
Объясните, покидайте ссылок. Не смог найти ничего конкретного.
(Хотя возможно я просто плохо искал...)
  • Вопрос задан
  • 528 просмотров
Решения вопроса 3
Composer работает по нескольким стандартам - PSR-0 и PSR-4 которые работают по соглашению именования классов и расположения файлов в которых они объявлены - то есть в нем реализована "Ленивая" загрузка классов - класс грузится только когда впервые используется (https://secure.php.net/manual/ru/language.oop5.aut...
Смотри также:
- https://www.php-fig.org/psr/psr-0/
- https://www.php-fig.org/psr/psr-4/

Так же для совместимости есть способ classmap когда явно задается карта "класс" => "файл":
- https://getcomposer.org/doc/04-schema.md#autoload
Ответ написан
gzhegow
@gzhegow
Думал, стану умнее, когда адаптируюсь, но нет
.ну в пыхе есть событие которое стреляет если ты пытаешься получить класс который еще не подгружен в память. Чтобы добавить на него действия, есть функция spl autoload register

Внутри композера отталкиваются от соглашения, что неймспейс должен быть равен пути к папке с файлом. Для частных случаев есть возможность указать неймспейс такойто в папке такойто, а дальше отрежет и будет искать относительно и по соглашению.

Для ускорения работы есть команда dump autoload, которая по вышеуказанным правилам пробежится по папкам и сделает ассоциативный массив, где ключ это класс, значение = путь к файлу. При запросе нового класса тогда уже не будет поиска и обращения к жесткому диску, а будет только isset
Ответ написан
@dasauser Автор вопроса
Пишу на PHP
В принципе все более-менее понятно.
Происходит подключение класса, например use Class.
Если класс не найден, то вызываются зарегистрированные spl_методы.
Метод ищет ключ Class ищет в карте_классов.json (забыл как называется), со структурой "class_path : file_path".
Если находится, то происходит подключение класса (require, include, когда как. Отчего зависит я так и не понял).
Если нет, то ищет в основных папках, массив путей которых тоже хранится где-то в каком-то виде (тут я не уверен, так ли в композере, но в другом автолоадере видел такое).
Если никогда ничего не найдено, то вернёт ошибку.
Вроде так, если кто знает больше - поправьте меня, исправлю ответ.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы