Помимо префиксов: руководство разработчика WordPress по пространствам имен PHP
Опубликовано: 2019-11-12Префикс всего.
Это поговорка стара, как само программное обеспечение WordPress. Префиксы так долго были стандартом для разработчиков 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 пространство имен Таверна;
Эта строка кода объявляет, что все в этом конкретном файле имеет пространство имен Tavern .
Взгляните на простую функцию в этом пространстве имен для вывода Hello, World! сообщение.
<?php
пространство имен Таверна;
функция привет () {
_e('Привет, мир!', 'example-textdomain');
} Если следовать старым правилам префикса, то hello() будет называться tavern_hello() . Однако это не относится к пространствам имен. Функция hello() инкапсулирована в пространстве имен Tavern и не будет конфликтовать с другими функциями с именем hello() .
Классы и интерфейсы работают так же, как функции. С именем класса Article файл класса может выглядеть следующим образом.
<?php
пространство имен Таверна;
статья класса {
// ...
}Примечание. В каждом файле должен быть только один класс или интерфейс. Это особенно важно, если вы когда-либо планируете использовать автозагрузчик.
Как назвать пространства имен
Разработчики любят спорить о том, как называть вещи, и универсального решения не существует. Самое главное правило — быть уникальным, чтобы избежать конфликтов с кодом из других проектов. Один из лучших способов сделать это — использовать пространство имен Vendor верхнего уровня с подпространством имен Package .
Предположим, что пространство имен поставщика — Tavern , а рассматриваемый проект — тема WordPress с именем News . Пространство имен для проекта может выглядеть следующим образом.
<?php пространство имен Таверн\Новости;
Это может быть немного многословно для некоторых разработчиков. Если название вашего проекта уже довольно уникально, например «Awesomesauce», вы можете просто использовать следующее.
<?php пространство имен Awesomesauce;
Вы захотите придумать какое-то стандартное соглашение, по крайней мере, для себя. В конце концов, вы захотите заняться такими вещами, как автоматическая загрузка, поэтому наличие системы, которой вы следуете во всех своих проектах, поможет. Не стесняйтесь ознакомиться со стандартом автозагрузчика PHP-FIG.
Импорт классов и функций в другое пространство имен
Когда вам нужно использовать класс или функцию из пространства имен, отличного от текущего пространства имен, вам необходимо импортировать его. Это делается с use ключевого слова use в PHP.

Оператор use должен идти после объявления namespace . Он также должен ссылаться на полное имя класса. Следующий код импортирует класс Tavern\Helpers\Post в файл с другим пространством имен.
<?php пространство имен Таверна\Шаблон; используйте Таверну\Помощники\Пост;
После импорта вы можете безопасно использовать класс Post напрямую, как показано в следующем фрагменте кода.
$сообщение = новое сообщение();
Начиная с PHP 5.6, вы также можете импортировать функции и константы из других пространств имен, используя use function use const соответственно. В следующем блоке кода показано, как импортировать как функцию, так и константу.
<?php пространство имен Таверна\Шаблон; использовать функцию Tavern\Helpers\func_name; использовать константу Tavern\Helpers\CONSTANT_NAME;
Псевдонимы классов и функций
В конце концов вы столкнетесь с ситуацией, когда вам нужно импортировать класс или функцию, имя которой совпадает с именем класса или функции в текущем пространстве имен. Вы можете подумать, что именно эту проблему призваны решить пространства имен. К счастью, PHP предоставляет метод создания псевдонима при импорте.
Предположим, у вас есть класс с именем Tavern\User и вам нужно реализовать интерфейс Tavern\Contracts\User . При импорте интерфейса вам нужно будет создать псевдоним, как показано ниже.
<?php
пространство имен Таверна;
использовать Tavern\Contracts\User в качестве UserContract;
класс User реализует UserContract {
// ...
} as UserContract , добавленный в конец оператора use , создает псевдоним для User интерфейса. Вы можете безопасно использовать новое имя UserContract без ошибок.
Классы, интерфейсы, функции и константы следуют одному и тому же методу создания псевдонима.
Организация структуры папок на основе пространств имен
Стандартной практикой в более широком мире PHP является соответствие пространств имен и структуры файлов и папок проекта. Это позволяет другим разработчикам легко находить код в вашем проекте. Это также упрощает создание автозагрузчиков для загрузки классов по запросу.
Как правило, весь PHP-код должен находиться в папке /src , /inc или с аналогичным названием в вашем проекте. Пример структуры файла и папки плагина может выглядеть следующим образом.
/ имя-плагина
/источник
/Основной
/Активировать.php
/Setup.php
/Вид
/Post.php
/Страница.php Если следовать той же структуре с пространствами имен, указанные выше файлы .php будут содержать следующие классы.
-
Tavern\Core\Activate -
Tavern\Core\Setup -
Tavern\View\Post -
Tavern\View\Page
Обратите внимание, что имена файлов и папок чувствительны к регистру и должны точно соответствовать пространству имен и имени класса.
Конечно, вы можете следовать любому соглашению, которое пожелаете. Однако предыдущая рекомендация является хорошей практикой и упростит организацию ваших проектов в долгосрочной перспективе.
Преимущества использования пространств имен
Наиболее очевидным преимуществом является избежание конфликтов между классами и функциями с одинаковыми именами. Вы должны использовать настоящие пространства имен по той же причине, по которой вы использовали префиксы.
Пространства имен помогают избежать длинных имен классов. Ввод длинных имен в большом проекте — в лучшем случае утомительная практика.
Более легкое переключение реализаций путем импорта. Как только вы научитесь импортировать классы и интерфейсы из других пространств имен, вы сможете переключать реализацию интерфейса с помощью одной строки кода.
Автозагрузка классов намного проще, если вы следуете стандарту PSR-4: Autoloader, для которого требуется как минимум пространство имен верхнего уровня.
Для разработчиков в профессиональной сфере вы получите рыночный навык за пределами экосистемы WordPress. Вам будет трудно найти работу по разработке PHP, если вы не знаете, как использовать пространства имен. Это не сложная концепция для понимания, но на практике для некоторых может потребоваться кривая обучения.
