Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. WordPress Plugins

Использование пространств имен и автозагрузок плагинов для WordPress, часть 3

by
Difficulty:IntermediateLength:MediumLanguages:
This post is part of a series called Using Namespaces and Autoloading in WordPress Plugins.
Using Namespaces and Autoloading in WordPress Plugins, Part 2
Using Namespaces and Autoloading in WordPress Plugins, Part 4

Russian (Pусский) translation by Yuri Yuriev (you can also view the original English article)

В этом уроке мы оторвёмся от написания кода и посмотрим, что это за пространства имён PHP и автозагрузки, как они работают и чем они полезны. Затем мы подойдём к завершению курса путём реализации кода.

Если вы не были на предыдущих уроках, я рекомендую вернуться и посмотреть, что было сделано к настоящему времени. По крайней мере, обратитесь к предыдущей статье, чтобы понять, о чём пойдёт речь дальше.

Теперь вы сообразили, что был создан плагин, осведомились, как он работает и для чего нужен. Кроме того, вы поняли, что должны иметь локальную среду разработки для работы с исходным кодом. Если нет, вот быстрое изложение необходимых вещей:

  • Локальный сервер с поддержкой PHP 5.6.20, веб-сервер Apache и сервер базы данных MySQL.
  • Каталог, из которого размещается WordPress 4.6.
  • Текстовый редактор или привычный вам IDE для написания плагина.
  • Навык работы с WordPress Plugin API.

Полагая, что всё у вас загружено, установлено и готово к работе с последней версией плагина, продолжим наши рассуждения о пространствах имён, автозагрузке и плагинах WordPress.

На пространствах имён и автозагрузке

Тем, кто работал с современными языками программирования, знаком принцип пространства имён. Но даже если вы работали с PHP, не факт, что узнали о них достаточно, по крайней мере, в контексте WordPress.

Тем, кто не слышал о них или слышал, но сам не пользовался, предназначена эта статья. Будем говорить только о пространствах имён и автозагрузке и затем, в последнем уроке, увидим, как это выглядит в сочетании одного с другим.

То есть, мы примемся за работу над уже созданным плагином и затем обновим его для использования пространства имён и автозагрузки. Это даст вам практическое понимание принципа действия нескольких новых инструментов и добавит возможностей для работы в следующем проекте.

Что есть пространства имён?

Как в большинстве моих уроков, сначала я даю формальное определение, затем пытаюсь пояснить его простым языком. В учебнике PHP пространства имён толкуются так like this:

В широком понимании пространства имён являются способом инкапсуляции элементов.

Это не очень нам помогло, правда? Можно возразить, что классы делают то же самое, позволяя атрибутам и функциям обобщать элементы. Дальше в учебнике говорится:

Пространства имен PHP предоставляют способ для группировки связанных классов, интерфейсов, функций и констант.

Немного понятней, так? Это означает, что когда у нас есть группа связанных классов, мы можем их объединить в том же каталоге или аналогичных каталогах файловой системы, но нет никакого способа узнать, что это, глядя на код.

Пространства имён дают нам эту возможность.

Давайте представим, что у вас есть набор функциональных возможностей, работающих в связке с CSVs.

  • Возможно, у вас есть класс, который отвечает за чтение CSV-файла, синтаксический анализ его содержимого и чтение содержимого в массиве.
  • Затем у вас есть класс, который отвечает за восприятие этого массива и записи в базу данных на основании его контента.
  • После всего, есть ещё класс, отвечающий за попытки обращения стороннего объекта или другой области кода к данным, которые были прочитаны, разобраны и сохранены ранее в исполнение проекта.

Вся эта функциональность должна охватывать несколько классов. В зависимости от решения вашего объектно-ориентированного кода, вы можете получить набор интерфейсов, которые реализуют ваши классы. К тому же, классы могут быть организованы в каталоге /csv, но разбиты еще дальше в подкаталогах.

  • /read
  • /write

Вы можете организовать структуры немного иначе, но, я подумал, для простоты обсуждения годится и так. Поэтому, пока что класс интерфейс(-ов) будет находиться в корневой папке /csv, ридер будет находиться в папке /read и классы, ответственные за запись данных в базу данных будут находиться в папке /write.

До сих пор я не сказал ничего необычного по организации наших файлов. Но здесь на сцену выходят пространства имён.

В частности, что, если мы сможем организовать классы в соответствии с их физическим расположением в файловой системе?

Подумайте: скажем, ваш плагин называется Acme CSV, а все вышестоящие классы организованы в папки, подпапки и так далее. Как может выглядеть пространство имён для этих классов и как они могут быть заявлены в рамках проекта?

Обратите внимание на то, что мы назовём классом Parser. Он находится в /csv/read.

Теперь скажем, что у нас есть класс, который записывает данные в базу данных:

Наконец, давайте посмотрим, что считывает из базы данных пространство имён вроде этого:

Не так уж и страшно, правда? Хотя это не типичный способ, которым вы будете организовывать свои файлы, я попытался соотнести мои классы с их расположением на диске. Будет проще к ним обратиться в предстоящей работе.

На данный момент больше нечего рассматривать, кроме заявления типа организации классов в верхушке их файла. Но когда вы подключите автозагрузку, ситуация поменяется.

Слово насчёт Packages и Subpackages

Прежде, чем говорить об автозагрузке, сделаю маленькое отступление на теги @package и @subpackage, которые мы так часто видим в комментариях файлов.

Например, вы могли заметить нечто вроде этой записи относительно нашего кода:

В документации phpDocumentor относительно @subpackage написано следующее:

Этот тег считается устаревшим и может быть удалён в будущей версии phpDocumentor. Рекомендуется использовать возможности тега @package для предоставления нескольких уровней.

Если тег @subpackage устарел, мы больше не должны обращать на него внимания. Как насчёт тега @package?

Тег @package используется для классификации структурных элементов в логические подразделения.

Поддержка нескольких уровней вложений принадлежит исключительно этому тегу. Просто и понятно, да? Это означает, что код, который мы видели выше, может быть прописан примерно так:

Конечно, это только пример, но он определяющий. Я упоминаю об этом потому, что тег @subpackage мы всё ещё часто встречаем в PHP на базе WordPress, а этого нужно избегать, если мы хотим работать по новым стандартам.

Что значит автозагрузка?

После сделанного отступления давайте вернёмся к теме, что у нас под рукой. Поскольку мы рассмотрели пространства имён, обратимся к автозагрузке. Согласно учебнику PHP:

Многие разработчики создают один исходный PHP файл для определения класса. Одной из больших неприятностей является необходимость составлять длинный список атрибутов в начале каждого скрипта (по одному для каждого класса).

Лучше не скажешь, не так ли? Тем не менее, это не очень объясняет понятие автозагрузки. Только представляет проблему, которую можно с её помощью решить.

В PHP 5 в этом больше нет необходимости... [он поддерживает загрузку] классы и интерфейсы загружаются автоматически, если они теперь не определены.

Звучит загадочно, правда? Это предостережение мы подробней разберём в следующем уроке. Ну, а пока что: для получения этой возможности мы должны реализовать функцию, которая знает, где искать файлы для загрузки и как анализировать структуру каталогов этих файлов.

Это звучит нудно и в некоторых случаях так оно и есть, но если вы владеете способом организации работы, ваш код автозагрузки может быть компактным. То есть вы можете прописать функцию, поместить её в любой PHP-проект и продолжать в том же духе.

Но этот специальный урок не о написании кода. Речь идет о концепции кода, которую мы будем осуществлять в следующем учебном блоке.

К чему это имеет отношение?

В зависимости от того, кого спрашивают, может оказаться, что пространства имён и автозагрузки это новинка в PHP. Для некоторых так оно и есть. Другие уже пользуются в своей работе этими двумя понятиями.

Одной из причин в WordPress, которые сдерживают принятие новых функций PHP, является его приверженность обратной совместимости. Это ни хорошо, ни плохо - это свойство приложения.

Но, поскольку WordPress имеет минимальную версию PHP, на которой выполняется, новые возможности языка не всегда могут быть адаптированы. А когда эта минимальная версия имеет совместимость, то разработчикам WordPress требуется некоторое время на то, чтобы начать использовать новые возможности в коде.

И это не так уж плохо. Иными словами, разработчики поддерживают темп роста приложения по мере его созревания.

Но, по мере продвижения WordPress или вашего желания развивать среду разработки своего проекта, вы можете быть заинтересованы в применении особенностей языка, о которых прежде не знали или они были вам недоступны.

Пространства имен и автозагрузки, это две мощные функции языка, которые делают код более читаемым, более организованным и даже более ремонтопригодным. Так что, если вы еще не использовали их в работе на WordPress, особенно в работе с WordPress плагинами, я рекомендую этим заняться.

Заключение

Пространства имён дают нам возможность организовать код таким образом, чтобы значительно облегчить логическое группирование связанных классов. С другой стороны, автозагрузки делают код более читаемым благодаря сокращению числа includeinclude_oncerequire или require_once необходимых уточнений.

Это делает исходный код, который мы пишем, яснее в смысле логики, за которую он отвечает, без необходимости манипуляций с импортом файлов, обработки структур каталогов и знания того, что надо и не надо (не говоря уже о постоянном переписывании всего ради получения доступа к файлу).

И для тех, кто хочет быть уверенным в том, что структура их кода соответствует организации файлов и каталогов на диске, это даёт возможность организовать проекты в точном соответствии.

Даже из сказанного понятно, что это лишь один из способов и несколько преимуществ пространств имен и автозагрузки. Более развёрнуто эти темы рассматриваются в руководстве по PHP и в других открытых источниках, с которыми я рекомендую ознакомиться, если найдёте время.

Следующим уроком мы завершим этот блок, применив знание того, как мы себе представляем пространства имён и автозагрузки, к нашему плагину WordPress. А пока, если вы ищете другие материалы, связанные с WordPress, можете обратиться к моим прежним урокам на my profile page и зайти on my blog или Twitter.

Не стесняйтесь задавать любые вопросы насчёт пространства имён, автозагрузок или WordPress в форме ниже.

Ресурсы

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.