Как частично добавить пространство имен PHP в библиотеку, не нарушая существующий код?


10

Моя компания создала модульную структуру PHP за эти годы, задолго до того, как в PHP 5.3 были добавлены пространства имен. Недавно мы решили начать использовать пространства имен в новом коде нашей библиотеки, и мы намерены в конечном итоге использовать пространство имен для старого кода. Однако у нас есть несколько проблем, которые мы пытаемся решить, чтобы определить, является ли добавление пространств имен в базу кода до v5.3 просто плохой идеей:

  1. Могу ли я использовать пространство имен для класса, а также импортировать (использовать) глобальное пространство имен, чтобы все глобальные классы не нуждались в \префиксе?
  2. Если мы поместим пространство имен в существующий класс в нашей библиотеке, как мы можем предотвратить разрушение всех существующих проектов после обновления инфраструктуры? Например, может ли библиотека изменить имя класса ThemeEngineна \module\theme\ThemeEngine, но существующие веб-сайты вызывают ThemeEngineбез какой-либо модификации кода? Если так, то как бы выглядел этот код?

Ответы:


2
  1. Вы не можете использовать пространства имен вообще, к сожалению, только классы: http://www.php.net/manual/en/language.namespaces.importing.php . Редактировать: вы можете импортировать классы из глобального пространства имен, как это было сделано с ArrayObject в одном из примеров.

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

Мы в одной лодке с тобой, вроде. У нас есть какой-то старый код, который не использует пространства имен, но использует фейкер пространства имен _ (например, Zend_Db_Table ...), и у нас есть некоторый старый код, который даже не имитирует пространства имен. Вероятно, мы пойдем по тому же маршруту, но нам все еще нужно проверить, возможно ли это вообще. Удачи!


1

Да, в конце концов я использовал - «использовал» для импорта отдельных классов, которые мне были нужны

например, вместо добавления «/» перед всем, как:

\DateTime()

Я добавил под своим пространством имен

namespace MyProject;
use DateTime;

...
DateTime();     //without \
...
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.