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

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