Автозагрузка классов, посмотрите на ошибки, что не учёл, какие могут возникнуть проблемы?

Здравствуйте!
Пишу учебный проект.
Взялся за автозагрузку классов.
Задачи
загружать классы из карты классов там прописаны все классы которые входят в ядро приложения
Загружать классы отдельных модулей и сторонних библиотек по namespace из разрешённых директорий.

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

Вот мой класс:

class Autoloader extends SC
{
    private static $instance = null;
    /**
     * @var array|string[]
     */
    private $systemClasses;

    /**
     * Autoloader constructor.
     */
    private function __construct()
    {
        $this->systemClasses = self::mapSystemClasses();
        spl_autoload_register([$this, 'load'], true, false);
    }

    /**
     * @return Autoloader|null
     */

    public static function getInstance()
    {
        if (!isset(self::$instance)) {
            self::$instance = new self();
        }
        return self::$instance;
    }

    /**
     * @param $class
     * Подключает найденный класс
     */
    private function load($class)
    {
        require_once $this->getClass($class);
    }

    /**
     * @param $class
     * @return mixed|string
     * Возвращает полное имя файла с классом
     */
    private function getClass($class)
    {
        $namespace = explode('\\', $class);
        $path = isset($namespace[1]) ? $this->otherClasses($class) : $this->systemClasses($class);
        if (is_readable($path)) {
            return $path;
        } else {
            exit('Нет файла с классом: ' . $class);
        }
    }

    /**
     * @param $class
     * @return mixed|string
     * Находит класс в карте и возвращает его имя файла
     */

    private function systemClasses($class)
    {
        if (isset($this->systemClasses[$class])) {
            return $this->systemClasses[$class];
        } else {
            exit('Класс ' . $class . ' не зарегистрирован');
        }
    }

    /**
     * @param $class
     * @return string
     * Ищет файл с запрошенным классом в разрешённых директорях public, vendor, test
     * по namespase и возвращает полное имя файла
     */
    private function otherClasses($class)
    {
        foreach ($this->folderClasses() as $dir) {
            $file = './' . $dir . '/' . str_replace('\\', '/', $class) . '.php';
            if (is_file($file)) {
                $path = $file;
            }
        }
        return $path;
    }

}
  • Вопрос задан
  • 118 просмотров
Пригласить эксперта
Ответы на вопрос 1
dimsog
@dimsog
Переносил код с PHP 4 на 7.4...
Смотрите, какие могут быть проблемы.
1) Если я хочу два разных автозагрузчика, которые загружают файлы из разных директорий, то упс, это нельзя, так как у нас синглтон.
2) extends SC, я так и не понял, что такое SC
3) В качестве обучения отлично, что вы используете spl_autoload_register, но посмотрите на возможности composer по загрузке классов
4) Очень много проблемных мест в коде, все перечислять очень долго, да и на данном этапе нет смысла, потому что все люди учатся и все делают ошибки, но вот явный косяк:
exit('Класс ' . $class . ' не зарегистрирован');
Я бы вам рекомендовал выбрасывать Exception в этом случае, а вы просто останавливаете скрипт.
5) Вы бы делали дополнительно проверку на class_exists, а то может получиться так, что файл загрузили, а класса то в нем нет.
Ответ написан
Ваш ответ на вопрос

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

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