Categories: Мнение

Помимо префиксов: Руководство разработчика WordPress по пространствам имен PHP

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

Использование префиксов – это практика создания удобной для кода версии имени вашего проекта и прикрепления ее к функциям, классам и другим вещам в глобальном пространстве имен. Например, вы назвали бы функцию tavern_get_post()вместо того, get_post()чтобы избежать конфликтов имен функций, что привело бы к фатальной ошибке.

Префикс – это одна из форм «пространства имен», которая представляет собой причудливый способ сказать, что имена в этом пространстве принадлежат определенному проекту. Однако префиксы (и суффиксы, которые встречаются реже) – это уловка времен, когда не существовало решения для языка PHP.

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

Пространство имен (почти) все

Пространство имен PHP охватывает только следующие элементы.

  • Классы
  • Интерфейсы
  • Черты
  • Функции
  • Константы, объявленные с constключевым словом, но неdefine()

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

Как создать пространства имен

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

<?php
namespace Tavern;

Эта строка кода объявляет, что все в этом конкретном файле имеет пространство имен Tavern.

Взгляните на простую функцию в этом пространстве имен для вывода Hello, World! сообщения.

<?php
namespace Tavern;
function hello() {
_e( ‘Hello, World!’, ‘example-textdomain’ );
}

Если бы следовать старым правилам префикса, hello()был бы назван tavern_hello(). Однако это не относится к пространствам имен. hello() Функция инкапсулируется в Tavern пространстве имен и не будет конфликтовать с другими функциями по имени hello().Классы и интерфейсы работают так же, как функции. С именем Articleкласса файл класса может выглядеть следующим образом.

<?php
namespace Tavern;
class Article {
// …
}

Примечание. В каждом файле всегда должен быть только один класс или интерфейс. Это особенно важно, если вы когда-нибудь планируете использовать автозагрузчик.

Как имя Namespaces

Разработчики любят спорить о том, как называть вещи, а универсального решения не существует. Самое важное правило – быть уникальным, чтобы избежать конфликтов с кодом из других проектов. Один из лучших способов сделать это – использовать Vendorпространство имен верхнего уровня с Packageподпространством имен.

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

<?php
namespace Tavern\News;

Для некоторых разработчиков это может быть немного многословно. Если название вашего проекта уже достаточно уникально, например «Awesomesauce», вы можете просто использовать следующее.

<?php
namespace Awesomesauce;

Вы захотите придумать какое-то стандартное соглашение, по крайней мере, для себя. В конце концов, вы захотите заняться такими вещами, как автоматическая загрузка, поэтому наличие системы, которой вы следуете во всех своих проектах, поможет. Не стесняйтесь ознакомиться со стандартом автозагрузчика PHP-FIG .

Импорт классов и функций в другое пространство имен

Если вам нужно использовать класс или функцию из другого пространства имен, чем текущее пространство имен, вам необходимо импортировать его. Это делается с помощью use ключевого слова в PHP.

use Заявление должно прийти после namespace декларации. Он также должен ссылаться на полное имя класса. Следующий код импортирует Tavern\Helpers\Post класс в файл с другим пространством имен.

<?php
namespace Tavern\Template;
use Tavern\Helpers\Post;

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

$post = new Post();

В РНР 5.6, вы можете также импортировать функции и константы из других пространств имен , используя use functionи use const ключевые слова, соответственно. В следующем блоке кода показано, как импортировать как функцию, так и константу.

<?php
namespace Tavern\Template;
use function Tavern\Helpers\func_name;
use const Tavern\Helpers\CONSTANT_NAME;

Псевдонимы классов и функций

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

Предположим, у вас есть класс с именем Tavern\Userи вам нужно реализовать Tavern\Contracts\User интерфейс. При импорте интерфейса вам нужно будет создать псевдоним, как показано ниже.

<?php
namespace Tavern;
use Tavern\Contracts\User as UserContract;
class User implements UserContract {
// …
}

Добавленный as UserContractв конец use оператора создает псевдоним для User интерфейса. Вы можете безопасно использовать новое UserContract имя без ошибок.

Классы, интерфейсы, функции и константы используют один и тот же метод создания псевдонима.

Организация структуры папок на основе пространств имен

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

Как правило, все PHP код должен идти в /src, /inc или аналогичным названием папки в вашем проекте. Пример структуры файла и папок плагина может выглядеть следующим образом.

/plugin-name
/src
/Core
/Activate.php
/Setup.php
/View
/Post.php
/Page.php

Если следовать той же структуре с пространствами имен, вышеуказанные .php файлы будут содержать следующие классы.

  • Tavern\Core\Activate
  • Tavern\Core\Setup
  • Tavern\View\Post
  • Tavern\View\Page

Обратите внимание, что имена файлов и папок чувствительны к регистру и должны точно соответствовать пространству имен и имени класса.

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

Преимущества использования пространств имен

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

Пространства имен помогают избежать длинных имен классов. Ввод длинных имен в большом проекте – в лучшем случае утомительная практика.

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

Автозагрузка классов намного проще, если вы следуете стандарту PSR-4: Autoloader , который требует как минимум пространства имен верхнего уровня.

Для разработчиков в профессиональной сфере вы получите рыночный навык за пределами экосистемы WordPress. Вам будет сложно найти работу по разработке PHP, если вы не знаете, как использовать пространства имен. Это не сложная концепция для понимания, но на практике некоторым может потребоваться обучение.

 

writer

Recent Posts

Плагин Delete Me для WordPress помогает владельцам веб-сайтов предоставить право на забвение GDPR

Поскольку до крайнего срока соблюдения GDPR ЕС осталось всего 178 дней , многие владельцы сайтов…

1 год ago

Команда Gutenberg наращивает юзабилити-тестирование в WordCamp US

Команда Gutenberg создаст станцию ​​тестирования удобства использования в WordCamp US, где посетители смогут принять участие…

1 год ago

Плагин распространителя теперь в бета-версии: новое решение для синдикации контента WordPress от 10up

Сегодня компания 10up опубликовала предварительную версию своего плагина Distributor , нового решения для синдикации контента…

1 год ago

Gutenberg 1.8 добавляет большую расширяемость для разработчиков плагинов

На этой неделе был выпущен Gutenberg 1.8 с несколькими заметными улучшениями, которые предоставят разработчикам плагинов…

1 год ago

Gutenberg 15.5 представляет экспериментальную поддержку разметки сетки

На этой неделе был выпущен Gutenberg 15.5 с новыми функциями и улучшениями возможностей полнофункционального редактирования…

1 год ago

DesktopServer 3.8.4 включает подарок сообществу

DesktopServer выпустил версию 3.8.4 своего программного обеспечения для локальной разработки. Эта версия включает в себя…

2 года ago