Как интерпретатор PHP загружает класс при автозагрузке (префикс пространства имен и иерархия диретоктория)
Primary tabs
Прежде всего вам необходимо понимать связь (и одновременно её отсутствие) между пространствами имен и автозагрузкой.
Далее, если при автозагрузке пространство имен не используется, то правило может быть любым -- например, класс просто ищется по имени в конкретной директории. Если же пространство имен считается определяющим положение файла, как например, в PSR-4, то функция может быть реализована например так.
В последнем примере указана вполне конкретная базовая директория (в самом коде функции автозагрузки), но возможны и более гибкие варианты, например для пакета composer конечно положение файла при загрузке по psr4 определяют две вещи:
- префикс пространства имен (некоторая часть полного имени класса) фактическим просто связывает с директорией, в которую данный менеджер закачивает пакет (об этом мы говорили с примером), этот же подход можно увидеть для всех пакетов, используемых демонстрационным проектом для SimpleMVC.
- Оставшаяся часть полного имени файла -- здесь psr4 требует, чтобы секции пространства имен в точности соответствовали директориям (а значит это можно запрограммировать в функции автозагрузки)
Пример префикса пространства в пакете composer
Рассмотрим класс контроллера из ядра SimpleMVC, его полное имя:
\ItForFree\SimpleMVC\mvc\Controller.php
Где же же он будет лежать в нашем проекте? Ответить на этот вопрос можно глянув манифест (т.е. composer.json), а именно:
- Имя пакета it-for-free/simple-mvc, а значит путь от корня нашего проекта будет
vendor/it-for-free/simple-mvc
(т.к. композер ккачает все зависимости в папку вендор).
Но согласитесь, что vendor/it-for-free/simple-mvc как-то не очень похоже по стилю написания на начало полного имени класса\ItForFree\SimpleMVC\mvc\Controller.php
. Как же решается эта проблема? Как раз тут и нужно показать, что будет являться префиксом, ну и вообще понять -- есть ли он.
- Чтобы разобраться с префиксом смотрим на секцию autoload всё того же манифеста, например:
"autoload": { "psr-4": { "ItForFree\\SimpleMVC\\": "src" } },
-- тут не двусмысленно показано (именно это будут использовать функции автозагрузки, которые есть у самого композера), что часть пути \ItForFree\SimpleMVC следует рассматривать как папку src, а фактически это папка
vendor/it-for-free/simple-mvc/src
от корня проект
- Что остаётся от имени -- если вычесть префикс с которым мы разобрались. Остаётся:
mvc\Controller.php
Обратите внимание, что в секции autoload было указано, что мы используем автозагрузку, соответствующую именно psr-4, а это значит, что префикс определяется произвольно, а вот дальше уже строго в соответствии с положением директорий, но у нас и тут все определено -- ведь директория "mvc" действительно лежит внутри src данного пакета, а уже в ней и лежит файл Controller.php с классом по имени Controller ;)
- Log in to post comments
- 2575 reads