Cyapa
@Cyapa

Как организовать автозагрузку на PHP без PSR?

Джентльмены, нужна ваша помощь в организации архитектуры.

Пишу небольшое PHP приложение использующие автозагрузку и namespaces.
В начале все шло хорошо: классы хранятся в каталоге /classes/, трэйты в каталоге /traits/. Корневой namespace указывает на принадлежность к тому или иному типу. С этим проблем не возникло.

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

Сейчас решил хранить исключения рядом с классом, которому они принадлежат. Корневым namespace для них будет Exceptions, дальше пойдет название холдер класса.

Реализация загрузчика должна послужить примером
<?php
    namespace Exceptions\Core\Autoloader;

    class ErrorAutoload extends \Exception{}
    class ErrorAutoloadRegistry extends ErrorAutoload{}
    class ErrorAutoloadInclude extends ErrorAutoload{}

    namespace Core;

    use \Exceptions\Core\Autoloader\ErrorAutoloadRegistry;
    use \Exceptions\Core\Autoloader\ErrorAutoloadInclude;

    class Autoloader
    {
        use \Traits\Singleton;

        protected function __construct()
        {
            if(!spl_autoload_register(array($this, 'autoload'), true))
            {
                throw new ErrorAutoloadRegistry();
            }
        }

        public function autoload($object_name)
        {
            $path = str_replace('\\', DIRECTORY_SEPARATOR, $object_name);
            $path = strtolower($path);

            switch(substr($path, 0, strpos($path, DIRECTORY_SEPARATOR)))
            {
                case 'classes':
                case 'traits':
                    break;

                case 'exceptions':
                    $path = substr($path, strpos($path, DIRECTORY_SEPARATOR) + 1);
                    $path = dirname($path);
                default:
                    $path = 'classes' . DIRECTORY_SEPARATOR . $path;
                    break;
            }

            $path = APPLICATION_ROOT . DIRECTORY_SEPARATOR . $path . '.php';

            if(!file_exists($path))
            {
                throw new ErrorAutoloadInclude($object_name);
            }

            require_once($path);
        }
    }
?>

Но, что-то мне подсказывает, что это не правильно. Есть идее получше?
  • Вопрос задан
  • 2637 просмотров
Пригласить эксперта
Ответы на вопрос 3
подтвержу: 1 класс - 1 файл.
И, да, возьмите фреймворк, или на худой конец композер для автолоадера.
Ответ написан
Комментировать
@usetester
1 класс эксепшена - 1 файл. Я делал исключения для эксепшенов, которые использовались 1 конкретным классом и более нигде, и держал их в файле этого класса, что не сказывалось на автозагрузке никак. Но потом одумался - поскольку при использовании опкод-кешера наличие 10 лишних файлов классов на производительность не оказывает никакого влияния вообще, а поодерживать код чуть-чуть проще. Последнее, имхо, сильно важнее всех остальных соображений, кроме производительности.

PS. Идея не использовать PSR ущербна в корне. Только не надо путать идею не использовать отраслевой стандарт с идеей не использовать популярный фреймворк. Это разные идеи :)
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы