Конфликт псевдонима пространства имен PHP?

Я использую разные версии одной и той же библиотеки в нескольких проектах. Библиотеки имеют такое пространство имен:

Проект А:

namespace Ewout\Project_A\Compatibility;
Class Core {}

Проект Б:

namespace Ewout\Project_B\Compatibility;
Class Core {}

...так далее

Чтобы везде не использовать полное пространство имен, я присваиваю им псевдонимы в PHP-файлах проекта:

Проект А (a/main.php):

use Ewout\Project_A\Compatibility\Core as CoreX;

Проект Б (b/main.php):

use Ewout\Project_B\Compatibility\Core as CoreX;

Это нормально? Сценарии проекта можно загружать одновременно, хотя мне никогда не понадобится псевдоним классов Project_A\Compatibility\Core и Project_B\Compatibility\Core в одном и том же файле. В глобальном пространстве имен нет класса CoreX (хотя, судя по моим тестам, это тоже не вызовет никаких проблем?).

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


person Ewout    schedule 15.02.2017    source источник
comment
Это не вызовет никакого конфликта. Но проверьте свой код, прежде чем спрашивать.   -  person Ad5001    schedule 15.02.2017
comment
Я проверил это: я еще не видел ошибок PHP, жалующихся на конфликты, но хочу убедиться, что это не вызовет проблем в будущем.   -  person Ewout    schedule 15.02.2017
comment
Ой жаль не видел. Но если вы не объедините a/main.php и /b/main.php, проблем не будет.   -  person Ad5001    schedule 15.02.2017
comment
Что вы подразумеваете под «не комбинировать a/main.php и /b/main.php»? Я including их обоих в одном и том же сценарии, и он работает без каких-либо ошибок, но это именно то, что я хотел спросить/в чем я не уверен.   -  person Ewout    schedule 15.02.2017
comment
Тогда это сработает. Я имел в виду добавление обоих кодов в один и тот же файл. Включение не вызовет никаких проблем.   -  person Ad5001    schedule 15.02.2017


Ответы (1)


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

Кроме того, и это помогает понять основной процесс:

Как разрешается неполное имя класса, такое как имя?

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

Если есть оператор импорта, который использует псевдоним для другого имени, то применяется псевдоним импорта.

В противном случае к имени добавляется текущее имя пространства имен.

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

Дополнительная полезная информация в документации по PHP: Часто задаваемые вопросы: что вам нужно знать о пространствах имен

person Ewout    schedule 21.02.2017