Класс «AutoLoader». Часть 1

Класс «AutoLoader». Часть 1

Для чего нужен автозагрузчик? Он позволяет подключить все необходимые для работы CMS файлы. Причём подключение происходит автоматически, при запуске системы. Это избавляет разработчика от необходимости подключать все файлы вручную. Конечно когда этих файлов не так много, то от автозагрузчика пользы мало. Но если количество этих файлов перевалит за сотню? А за две сотни? Вот тут помощь автозагрузчика весьма кстати.

Что требуется от автозагрузчика? Он должен находить в указанных папках, в том числе и во вложенных директориях, файлы “.php”, которые необходимо подключить. Автозагрузчик должен уметь подключать одиночные файлы или группы файлов. Также он должен хранить информацию о месторасположении всех подключаемых файлах и их пространствах имён. Данная информация может нам пригодиться для поиска того или иного класса. Ну что же поехали!

autoload_1

В папке “core” каталога “includes” создаём файл “AutoLoader.php” В нём сразу укажем пространство имён “Wp\Core” и имя класса “AutoLoader”. Далее объявляем переменные “$instance” и “$exception”. В первой переменной будет храниться ссылка на текущий класс,а во второй ссылка на класс “Exception”. Теперь объявим три массива:

  • classMap” – ассоциативный массив, в котором в качестве ключей выступает комбинация пространства имён и имени класса, а в качестве значений массива полные пути к файлам, где эти классы были определены.
  • classMapFrom” – тут хранятся пути к папкам, где расположены php файлы, которые необходимо подключить.
  • files” – в данном массиве хранятся полные пути к каждому файлу, что находятся в папках, указанных в массиве “classMapFrom”. Эти пути затем передаются массиву “classMap”.

Запуск класса производится при помощи метода “getInstance()”. Данному методу, в качестве параметра, может передаваться список папок, “.php” файлы которых необходимо подключить или же файл “.php”, который уже содержит ассоциативный массив со списком классов и их файлов. Данный метод либо инициализирует класс “Autoloader”, либо возвращает ссылку на него.

autoload_2

Если требуется инициализация класса, то запускается конструктор. Он закрыт от внешнего доступа с помощью модификатора “private”. В первую очередь регистрируем класс “AutoLoader” в качестве метода автозагрузки.

Заметьте именно в качестве метода. Дело в том, что регистрация возможна только с помощью функции “spl_autoload_register()“. Данная функция может зарегистрировать в качестве автозагрузчика только другую функцию. Нам же необходимо зарегистрировать целый класс. Чтобы это сделать нам понадобится помощь “магического метода __invoke()”. Его мы укажем в конце тела класса. Данный метод вызывается, когда скрипт пытается выполнить объект (класс) как функцию.

После регистрации класса приступаем к обработке переданного параметра “$path”. С помощью функции “is_array()”, узнаём является ли параметр “$path” массивом или нет. Если является, тогда запускаем конструкция “foreach”. Она позволяет перебрать любой массив. Особенно данная конструкция удобна для работы с ассоциативными массивами.

При переборе массива, мы извлекаем значение каждого его элемента и выясняем является ли полученное значение файлом (“is_file()”) или папкой(“is_dir()”). Если это файл, то запускаем метод “addClassMapFromFile()” класса “AutoLoader”. Если это папка, то запускаем метод “addClassMapFromDir()” этого же класса. Если параметр “$path” не является массивом, тогда узнаём является ли данный параметр файлом или папкой и запускаем метод “addClassMapFromFile()” или “addClassMapFromDir()”.

Эти два метода позволяют построить “карту классов”. То есть создаётся ассоциативный массив, в котором ключом является комбинация пространства имени класса и его названия. Значением же служит полный путь к файлу, в котором был объявлен этот класс. В классе “AutoLoader” карта классов хранится в массиве classMap”.

После того, как формирование карты классов завершилось, запускается метод “loadAllFiles()”. Он перебирает всю карту классов и подключает каждый указанный файл. Стоит отметить, что подключаемый файл может не содержать каких-либо классов, но в нём могут быть прописаны различные функции. В этом случае файл тоже будет подключён.

В конце конструктор получает ссылку на класс “Exceptions”. Это следует делать только после подключения всех необходимых файлов. Если попытаться получить ссылку на класс “Exceptions” до подключения, тогда возникнет ошибка, которую наш обработчик перехватить не сможет.

autoload_3

Теперь подробно рассмотрим методы класса “AutoLoader”. Первый рассматриваемый метод это “register()“. В теле этого метода прописана функция “spl_autoload_register()”. В качестве параметров ей передаётся: а) ссылка(“this”) на класс “Autoloader”; б) “TRUE” – этот параметр определяет, должна ли функция spl_autoload_register() сообщить нам о том,что регистрация класса в качестве метода автозагрузки не удалась; в) “FALSE” – указывает на то, что наш метод автозагрузки следует поместить в конец.

Метод “unregister()” использует функцию “spl_autoload_unregister()” для отмены регистрации класса “AutoLoader” в качестве метода автозагрузки. В качестве параметра этой функции передаётся ссылка на этот класс.

getClassMap()” – данный метод возвращает ассоциативный массив (карту классов) “classMap“.

addClassMap()” – данный метод добавляет к существующей карте класса группу дополнительных записей. Данному методу передаётся ассоциативный массив, построенный по тому же принципу, что и массив “classMap“. При запуске данного метода, в первую очередь проводится проверка передаваемого параметра. С помощью функции “is_array()” выясняем, является ли этот параметр массивом. Если это так, тогда проверяем является ли он ассоциативным массивом. Если это так, тогда используем функцию “array_merge()” для слияния двух массивов.

autoload_4

addToClassMap()” – позволяет добавлять к карте класса одиночные записи. Для этого данному методу передаются:

  • Пространство имён через переменную “$prefix”
  • Имя класса через переменную “$class”
  • Путь к файлу класса с помощью переменной “$path”

Если переменной “$prefix” можно присваивать пустую строку в качестве значения, то для перменных “$class” и “$path” этого делать нельзя. Поэтому при запуске этого метода проводится проверка обеих переменных. Если они не пустые, тогда можно добавить к карте классов новую запись.

Заметьте, что для всех трёх переменных используется конструкция “(string)”. Это так называемое “приведение типов“. Оно позволяет значение указанных переменных представить в виде строки. Для нас это крайне важно, поскольку ключ массива “classMap” и его значение должны быть строковыми.

removeClassMap()” – этот метод обнуляет весь массив “classMap“. Таким образом удаляется вся карта классов.

removeFromClassMap()” – удаляет одиночную запись из карты классов. Для этого достаточно указать:

  • Пространство имён через переменную “$prefix”
  • Имя класса через переменную “$class”

Если переменная ” $class ” прошла проверку, тогда удаляем запись из карты класса с помощью функции “unset()”.

Все перечисленные методы предполагают “ручное” добавление классов в массив “classMap“. Но мы ведь создаём автозагрузчик, то есть предполагается, что весь процесс будет происходить в автоматическом режиме. Потому этих методов не достаточно. Во второй части статьи будут рассмотрены остальные методы класса “Autoloader”, которые автоматизируют весь процесс построения карты классов и подключения файлов.

You may also like...

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

  • Sign up
Lost your password? Please enter your username or email address. You will receive a link to create a new password via email.