Как назвать файлы пространств имен?

9

WP Core Handbook> Стандарты кодирования PHP> Соглашения об именовании предлагают следующее для именования файлов с классами:

Имена файлов классов должны быть основаны на имени класса с class- префиксом, а подчеркивания в имени класса заменены дефисами, например WP_Error:

class-wp-error.php

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

Однако, поскольку ядро ​​не поддерживает пространства имен (PHP 5.2, тьфу), это не учитывает такой случай.

Каков практический путь для этого с точки зрения удобства разработчика? Поддержка автозагрузчиков?

Я мог видеть несколько альтернативных способов:

  • полностью игнорируя пространство имен
  • включая пространство имен в имени файла
  • используя пространства имен в качестве уровней папок
  • используя альтернативную схему именования, такую ​​как PSR
Rarst
источник
3
Честно говоря, если вы используете PHP 5.3+, вы уже нарушаете основные правила WP. Кроме того, учтите, что стандарты WP не учитывают интерфейсы или особенности. Поэтому для меня просто имеет смысл выбрать удобный для вас способ и использовать уже установленный стандарт, такой как PSR, в таком случае кажется лучшим выбором.
gmazzap

Ответы:

7

Во-первых, игнорируйте class-префикс. Это происходит из подхода чистого процедурного кода WordPress, классы используются в качестве контейнеров для процедурного кода, а не для реальных объектов, и большинство файлов вообще не содержат классов или классов и другого кода вместе. Это не имеет смысла, когда все ваши файлы содержат только один класс и ничего больше.
Если вы будете следовать этой схеме, вам придется использовать interface-foo.phpи trait-bar.php. Это не просто смешно, но и делает автоматическую загрузку тяжелее, чем необходимо.

Самым простым способом разделения пространств имен и имен классов / интерфейсов / признаков является (по моему опыту) назначение пространств имен именам каталогов и именам классов именам файлов. Это делает его очень легко сопоставить требуемый класс данной структуры файла в автопогрузчика: просто конвертировать \в /, Append .phpи загрузить файл.

Это также упрощает кеширование поиска: для каждого каталога / пространства имен вы можете извлечь все существующие файлы при первом запросе каталога, а для последующих вызовов вы можете повторно использовать этот список имен файлов, не запрашивая file_exists()каждый раз ,

Фуксия
источник
4
Другими словами: Сделайте это PSR-совместимым :)
kaiser
2

Я сделал класс для этого требования, совместимый с PSR-4 и следуя стандартам кодирования Wordpress.

Вы можете связаться с ним здесь: https://github.com/pablo-pacheco/wp-namespace-autoloader

Все объяснение есть, но в основном это зависимость от композитора. Вы просто должны потребовать это в своем проекте:

"require": {    
    "pablo-pacheco/wp-namespace-autoloader": "dev-master"
}

А потом позвоните в класс

<?php
new \WP_Namespace_Autoloader( array(    
    'directory'   => __DIR__,       // Directory of your project. It can be your theme or plugin. __DIR__ is probably your best bet.    
    'namespace'   => __NAMESPACE__, // Main namespace of your project. E.g My_Project\Admin\Tests should be My_Project. Probably if you just pass the constant __NAMESPACE__ it should work     
    'classes_dir' => 'src',         // (optional). It is where your namespaced classes are located inside your project. If your classes are in the root level, leave this empty. If they are located on 'src' folder, write 'src' here 
) );
Пабло С.Г. Пачеко
источник
1

Я вообще собираюсь со второй половиной ваших вариантов:

  • используя пространства имен в качестве уровней папок
  • используя альтернативную схему именования, такую ​​как PSR

Если вы используете composer для регистрации автозагрузчика PSR-4, вы можете придерживаться соглашений об именах WP. Пространства имен, сопоставленные с папками, которые могут содержать подчеркивания с файлами, названными как класс, который также может содержать подчеркивания. Подобно:

<Namespace_Dir>/Class_Name.php

Когда WP переходит на php 5.3+ (это должно произойти в конце концов, верно ?!), руководящие принципы должны быть обновлены. Поскольку PSR-0 уже устарел, PSR-4 следует по крайней мере рекомендовать, если не требуется.

cfoellmann
источник
0

Решение pablo-sg-pacheco сработало для меня, автозагрузка опиралась на composer, но совместима со стандартами кодирования WordPress, однако URL для репозитория Github:

https://github.com/pablo-sg-pacheco/wp-namespace-autoloader

и имя пакета:

"require": {    
    "pablo-sg-pacheco/wp-namespace-autoloader": "dev-master"
}

Наконец, вам также нужно добавить следующее в ваш composer.json, потому что пакет не доступен в packagist:

"repositories": [{
    "type": "vcs",
    "url": "https://github.com/pablo-sg-pacheco/wp-namespace-autoloader"
}] 
guillaume.molter
источник