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

Теперь переходим к заключительному этапу разработки класса “AutoLoader”. В данной статье я подробно рассмотрю ключевой метод создания карты классов “generateClassMap()“, а также методы, подключающие все необходимые файлы, опираясь на созданную карту классов.

autoload_8

Теперь перейдём к ключевому методу класса “AutoLoader”. Это метод “generateClassMap()“. Он самостоятельно создаёт карту классов. Сначала создаётся пустой массив “$newClassMap”. Он будет заполняться необходимыми данными. Далее запускаем метод “discoverFiles()”. После того, как данный метод заполнил массив “files“, можно приступить к его перебору с помощью конструкции “foreach”. В процессе перебора создаются два массива “$classMatch” и “$namespaceMatch”. Далее надо получить содержимое файла. В этом поможет функция “file_get_contents()”. В качестве параметра ей передаётся путь к “.php” файлу.

Так как метод ” generateClassMap()” должен создавать карту классов, то нам потребуется знать пространство имён и имя класса. Также нам необходимо знать расположение файла. Если с последним проблем нет, то как нам узнать пространство имён и имя класса?

Вот для этого нам понадобится обработать содержимое файла, которое было получено чуть раньше. Мы будем искать ключевые слова “namespace”, “class”, “final”, “abstract” и “abstract”. Для этого используем два регулярных выражения:

'/^(final|abstract|interface|class)(.*)$/m'
и
'/^namespace(.*)$/m'

Функция “preg_match()” ищет, согласно регулярным выражениям, строки и заносит их в массивы “$classMatch ” и “$namespaceMatch”.

Если разбирать само регулярное выражение, то оно находится между символами “/”. “m” – это один из модификаторов любого регулярного выражения. Его использование говорит о том, что регулярное выражение должно начинаться с символа “^”, означающим начало строки, и заканчиваться символом “$”, означающим конец строки. Далее идёт перечисление всех необходимых ключевых слов. Затем следует комбинация символов “.*”. Она говорит о том, что после ключевого слова могут идти любые символы (за исключением символов конца строки) в любом количестве .

autoload_9

Вот как это работает. Как видите первым было обнаружено ключевое слово “class”. Если пред этим словом написать “final” или “abstract”, то первым будет выделено одно из этих слов. В массиве сохранится вся строка. Поиск и сохранение строки с пространством имён происходит аналогичным образом.

Кстати, проверить работу любого регулярного выражения можно на сайте https://regex101.com/.

После того как были найдены все интересующие нас строки, возникает необходимость создать ключи для карты классов. Для этого обращаемся к массиву “$classMatch “. Нас интересует элемент массива с индексом “0”. Если этот элемент существует, значит было найдено совпадение. Элемент массива с индексом “1” позволяет понять какое из ключевых слов было найдено. В элементе с индексом “2” хранится строка без ключевого слова. Если ключевым словом было “abstract” или “final”, то возникает необходимость удаления слова “class” из строки элемента массива с индексом “2”. Это делается с помощью функции “str_replace()”. Она заменяет слово “class” на пустую строку. После того, как избавимся от пробелов в начале и конце строки, используя функцию “trim()”, можно будет извлечь название класса. Затем проделаем похожие операции с элементами массива “$namespaceMatch”.

autoload_10

Так как мы получили пространство имён и название класса, то формируем из них ключ для ячейки массива “$newClassMap”. Затем заносим данные в этот массив.

А что же делать с теми файлами, в которых нет пространств имён и классов? Эти файлы тоже подключаются, но в качестве ключей используются их имена. Таким образом мы получаем массив, который потом соединяется с массивом “classMap“.

autoload_11

Метод “writeToFile()” – записывает карту классов в отдельный “.php” файл в виде массива. Данной функции передаётся параметр “$output”. Это путь к записываемому файлу. Далее с помощью конструкции “foreach”:

foreach (array_expression as $key => $value)
    statement

записываем в переменную “$code” массив “classMap“. При этом переменная “$class” является ключом массива, а переменная “$file” указывает месторасположение файла. Получается такой результат:

<?php

return [
'any key' => 'any path',
'any key' => 'any path', 
'any key' => 'any path', 
'any key' => 'any path', 
'any key' => 'any path' 
];

После того как переменная “$code” сформирована, её содержимое записывается в файл с помощью функции “file_put_contents()”. Этот метод будет полезен тогда, когда требуется сохранить карту классов.

autoload_12

Метод “addClassMapFromFile()” – данный метод получает карту класса при подключении указанного файла “$file”. Далее он добавляет её к массиву “classMap“.

Метод “addClassMapFromDir()” – сканирует указанные (“$dir”) директории, получает всё их содержимое, строит карту классов на основании полученного содержимого, а затем добавляет полученную карту к массиву “classMap“.

autoload_13

findFile()” – этот метод возвращает путь к файлу, в котором расположен класс “$class”.

loadClass()” – данный метод подключает файл “.php”, в котором находится класс “$class”, используя выражение “require_once“. Использование этого выражения гарантирует однократное подключение нужного файла. Это позволит избежать ошибок в работе CMS при повторном подключении этого файла.

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

Метод “loadFile()” – подключает одиночный файл, содержащий класс “$class”.

Метод “loadGroupFiles()” – подключает группу файлов, которые содержат указаные в массиве “$group” классы.

Метод “loadAllFiles()” – подключает все файлы, указанные в карте классов.

Метод “__invoke()” – этот описывается в первой части статьи “Ядро WordPress. Введение. Класс «AutoLoader»“.

На этом подготовительный этап окончен. Теперь всё моё внимание будет обращено к ядру WordPress. Но об этом в следующей статье.

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.