Как интерпретатор PHP загружает класс при автозагрузке (префикс пространства имен и иерархия диретоктория)

Прежде всего вам необходимо понимать связь (и одновременно её отсутствие) между пространствами имен и автозагрузкой.

Далее, если при автозагрузке пространство имен не используется, то правило может быть любым -- например, класс просто ищется по имени в конкретной директории. Если же пространство имен считается определяющим положение файла, как например, в PSR-4, то функция может быть реализована например так.

В последнем примере указана вполне конкретная базовая директория (в самом коде функции автозагрузки), но возможны и более гибкие варианты, например для пакета composer конечно положение файла при загрузке по psr4 определяют две вещи:

  1. префикс пространства имен (некоторая часть полного имени класса) фактическим просто связывает с директорией, в которую данный менеджер закачивает пакет (об этом мы говорили с примером), этот же подход можно увидеть для всех пакетов, используемых демонстрационным проектом для SimpleMVC.
  2. Оставшаяся часть полного имени файла -- здесь psr4 требует, чтобы секции пространства имен в точности соответствовали директориям (а значит это можно запрограммировать в функции автозагрузки)

Пример префикса пространства в пакете composer

Рассмотрим класс контроллера из ядра SimpleMVC, его полное имя:
\ItForFree\SimpleMVC\mvc\Controller.php

Где же же он будет лежать в нашем проекте? Ответить на этот вопрос можно глянув манифест (т.е. composer.json), а именно:

  1. Имя пакета it-for-free/simple-mvc, а значит путь от корня нашего проекта будет
    vendor/it-for-free/simple-mvc

    (т.к. композер ккачает все зависимости в папку вендор).
    Но согласитесь, что vendor/it-for-free/simple-mvc как-то не очень похоже по стилю написания на начало полного имени класса

    \ItForFree\SimpleMVC\mvc\Controller.php

    . Как же решается эта проблема? Как раз тут и нужно показать, что будет являться префиксом, ну и вообще понять -- есть ли он.

  2. Чтобы разобраться с префиксом смотрим на секцию autoload всё того же манифеста, например:
        "autoload": {
            "psr-4": {
                "ItForFree\\SimpleMVC\\": "src"
            }
    },
    

    -- тут не двусмысленно показано (именно это будут использовать функции автозагрузки, которые есть у самого композера), что часть пути \ItForFree\SimpleMVC следует рассматривать как папку src, а фактически это папка

    vendor/it-for-free/simple-mvc/src

    от корня проект

  3. Что остаётся от имени -- если вычесть префикс с которым мы разобрались. Остаётся:
    mvc\Controller.php
    Обратите внимание, что в секции autoload было указано, что мы используем автозагрузку, соответствующую именно psr-4, а это значит, что префикс определяется произвольно, а вот дальше уже строго в соответствии с положением директорий, но у нас и тут все определено -- ведь директория "mvc" действительно лежит внутри src данного пакета, а уже в ней и лежит файл Controller.php с классом по имени Controller ;)