Перейти к содержанию

3.7 Класс “Autoloader”. Формирование полной карты классов. Метод generateClassMap()

Last updated on 09.05.2021

autoloader2

В данной статье я подробно рассмотрю ключевой метод создания карты классов “generateClassMap()”.

Метод generateClassMap()

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

autoload-8

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

Вот для этого нам понадобится обработать содержимое файла, которое было получено чуть раньше. Мы будем искать ключевые слова “namespace”, “class”, “final”, “interface” и “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”.

generateClassMap

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

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

Таким образом метод generateClassMap() сформирует полную карту классов и функций. Теперь остаётся их подключить.

Опубликовано в рубрике3. Класс AutoloaderЯдро Wordpress