Коротко: автозагрузчик по PSR-4 можно написать без Composer — через spl_autoload_register и функцию, превращающую namespace в путь к файлу.

Автозагрузчик по PSR-4 можно написать и без Composer — через spl_autoload_register и небольшую функцию, которая преобразует namespace в путь к файлу. Разберём простейшую реализацию на примере MVC-блога с единой точкой входа index.php.

Есть несколько подходов к организации автолоадера. Сегодня мы рассмотрим один из них.

Реализация autoloader по PSR-4 без composer ( closure example )

На примере простейшего приложения мы разберем как реализовать простейший автозагрузчик.

Предположим, что у нас есть блог и мы в нем выводим на экран статью. Мы хотим в простейшем варианте реализовать MVC архитектуру и реализовать контроллер, модель и вьюху. И также нам нужна одна единая точка входа index.php

Файловая структура у нас будет выглядеть так:

src
    Controller
        IndexController.php
    Model
        ArticleModel.php
    View
        ArticleView.php
autoload.php
index.php

Используя PSR-4 мы можем определить для себя такой вот файлик autoload.php

<?php

function autoloaderFunction(string $class): void
{
    $prefix = 'App\\'; //определяем неймспейс для нашего приложения
    $len = strlen($prefix);
    if (strncmp($prefix, $class, $len) !== 0) return;

    $relative_class = substr($class, $len); //определяем класс                            

    $base_dir = __DIR__ . '/src/'; //определяем директорию
    $file = $base_dir . str_replace('\\', '/', $relative_class) . '.php'; //определяем полный путь до файла

    if (file_exists($file)) { //если файл существует
        require_once $file;   //подключаем
    }
}

spl_autoload_register('autoloaderFunction');

Далее создаем для себя точку входа в приложение index.php

<?php

use App\Controller\IndexController;

require_once 'autoload.php'; //подключаем наш автолоадер

$indexController = new IndexController(); //подключаем наш контроллер

echo($indexController->getArticles()); //вызываем метод контроллера

Создаем файлик вьюху в самом простом виде ArticleView.php

<?php

namespace App\View;

class ArticleView
{
    private array $articles;

    public function __construct(array $articles)
    {
        $this->articles = $articles;
    }

    public function render(): string
    {
        return print_r($this->articles, true);
    }
}

Создаём модель статей ArticleModel.php:

<?php

namespace App\Model;

class ArticleModel
{
    public function getArticles(): array
    {
        return [
            ['title' => 1, 'text' => 'Loerm ipsum',],
            ['title' => 2, 'text' => 'Loerm ipsum',],
            ['title' => 3, 'text' => 'Loerm ipsum',],
            ['title' => 4, 'text' => 'Loerm ipsum',],
        ];
    }
}

И наконец создаем контроллер IndexController.php:

<?php

namespace App\Controller;

use App\Model\ArticleModel;
use App\View\ArticleView;

class IndexController
{
    public function getArticles(): string
    {
        $articleModel = new ArticleModel();
        $articles = $articleModel->getArticles();
        $view = new ArticleView($articles);
        return $view->render();
    }
}

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

А если PSR-4-автозагрузку нужно не писать руками, а получить «из коробки» — смотрите вариант через Composer.