Оценка пространств имен PHP

11

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

Некоторые соображения относительно пространств имен:

  • Один из способов, которыми мой проект пытается дифференцировать себя, предоставляя более простой API, чем другие подобные проекты. Поскольку пространства имен являются новыми, а также потому, что они более сложны, чем соглашение об именах PEAR, введение их в кодовую базу сделает мой проект менее простым в использовании. Реализуя их, я теряю некоторую дифференциацию с точки зрения простоты использования.
  • Хотя я вижу некоторые преимущества для пространств имен, они, похоже, не решают проблему, которую необходимо решить в современном продукте PHP, использующем соглашение об именах PEAR. Конфликты имен при использовании моего проекта должны быть минимальными, если не существующими.
  • Эта статья дает мне некоторую паузу в освоении пространств имен, поскольку их реализация была менее чем звездной.
  • Я также не решаюсь прыгнуть на подножку, которая может никуда не денется. Поскольку пространства имен являются новой функцией PHP, я еще не уверен, что они станут стандартными.
  • Совместимость. Почти весь код PHP, который когда-либо был написан, не использует пространства имен, поскольку это новая функция. Другие библиотеки были бы несовместимы без преобразования.

Некоторые моменты для использования пространств имен:

  • Восприятие. Если пространства имен станут стандартными и лучшими практиками, мой проект может быстро стать непрофессиональным и устаревшим без них.
  • Соревнование. Хотя некоторые конкурирующие проекты PHP начинают использовать пространства имен в своих последних версиях, многим еще предстоит сделать скачок. Теперь это может помочь моему проекту в других проектах.
  • Дальнейшая работа была бы проще, если бы я сделал переход сейчас, прежде чем проект станет общедоступным, а не после, когда мне придется некоторое время поддерживать две его версии.
  • Я хочу поддержать лучшие практики, и если пространства имен станут лучшей практикой для PHP, мой проект должен использовать их.

Из того, что я могу сказать, вы должны выбрать тот или иной путь; Вы не можете сделать оба. Есть ли моменты, которые я не учел? Существуют ли какие-либо объективные признаки (не пламенные войны, пожалуйста), которые указывают на или против того, что пространства имен становятся профессиональным стандартом для PHP? Я был бы признателен за любую информацию или ресурсы, которыми вы бы хотели поделиться, поскольку мне нужно принять решение в ближайшее время.

VirtuosiMedia
источник

Ответы:

5

Два признака того, что пространства имен в PHP сохраняются:

  1. Схема именования PEAR была заброшена в пользу пространств имен в PEAR2 .
  2. Одна из заявленных целей Zend Framework 2.0 - стать примером использования PHP 5.3 , в том числе путем полного использования пространств имен. Я считаю это ярким свидетельством того, что Zend полностью привержен пространствам имен и будет продолжать поддерживать и развивать их (надеюсь, к лучшему).

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

  • Лучшая организация кода,
  • Избегая конфликтов имен,
  • Контекст для классов, функций и констант.

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

Яннис
источник
+1 за ссылки. Не могли бы вы рассказать о лучшей организации кода и контекстах? Мне немного трудно понять, как это обеспечивает лучшую организацию кода. Кажется, что большинство проектов будут придерживаться структуры 1: 1 для файловой структуры, сгруппированной в логические каталоги, так же, как вы использовали бы в схеме именования PEAR. Даже ZF2 выглядит так, как будто он использует те же структуры каталогов и файлов в большинстве случаев, но только сейчас с пространствами имен. Это отличается, но я не обязательно вижу, как это лучше или более организовано, чем хорошо названные каталоги и файлы во-первых.
VirtuosiMedia
У меня тоже проблемы с контекстом. Во всяком случае, кажется, что пространства имен удаляют контекст, чтобы иметь более сжатый стиль кодирования, а не добавлять контекст. Например, если я создаю экземпляр нового класса глубоко в файле, мне теперь нужно найти место, где было объявлено пространство имен, чтобы выяснить, какой это класс, а не сразу увидеть его по имени класса. Если я что-то упускаю, кажется, что пространства имен менее многословны, но за счет ясности.
VirtuosiMedia
@VirtuosiMedia PEAR и старые схемы именования ZF эмулируют пространства имен, так что мои три замечания в некоторой степени верны и для них. Я пытаюсь указать, что если эти точки верны в текущей реализации пространств имен PHP, то их маленького snafus недостаточно, чтобы не использовать их. С лучшей организацией кода я имею в виду в основном файлы, используя разумную и логичную структуру и иерархию для ваших классов, что, конечно, выполнимо без пространств имен. Но пространства имен (и схемы, которые имитируют их) - это функция, которая помогает вам достичь всех трех пунктов одновременно.
Яннис
Попался. Спасибо за разъяснения. Видите ли вы значительные преимущества для реальных пространств имен по сравнению с эмулируемыми пространствами имен?
VirtuosiMedia
1
@VirtuosiMedia Все пункты для использования пространств имен, которые вы делаете по этому вопросу, действительны. К этому я бы добавил, что пространства имен PHP помогают вашему коду чувствовать себя немного более естественным для программистов из разных областей, что может оказаться неоценимым в большом проекте. Также не существует стандарта для эмулируемых пространств имен, конечно, большинство из них примерно одинаковы, но использование реальных пространств имен гарантирует, что все используют одну и ту же схему. Кстати, есть пространство имен , которое вы могли бы использовать для расширения пространства имен своего кода.
Яннис