Разрешено ли импортировать (посредством использования) класс из другого пространства имен в PHP, когда он сталкивается с классом в текущем пространстве имен?

Когда используешь use импортировать / псевдоним пространства имен в текущем пространстве имен в PHP - разрешено ли импортировать в имя класса, который существует в текущем пространстве имен, но не используется в текущем файле?

PHP 5.6 и 7.x, похоже, ведут себя по-разному. К сожалению, я не мог понять, разрешено ли это вообще. Если бы это было запрещено, я бы хотел, чтобы моя IDE обнаруживала такие коллизии (потому что код мог снова сломаться в любой момент), иначе это ошибка PHP в версии 5.6.

Посмотрите минимальный код, чтобы получить идею:

SRC / Главная /Bar.php:

namespace Cumuru\MinimalExample\Main;

class Bar { }

SRC /ToBeImported/Bar.php

namespace Cumuru\MinimalExample\ToBeImported;

class Bar { }

SRC / Главная / foo.php

namespace Cumuru\MinimalExample\Main;
use Cumuru\MinimalExample\ToBeImported\Bar;

class Foo { }

index.php

// [initialize autoloading]
// the following line breaks the code
$bar = new \Cumuru\MinimalExample\Main\Bar();
$foo = new \Cumuru\MinimalExample\Main\Foo();

Этот код сломается в PHP 5.6, в то время как в 7.1 он работает без сбоев. Сообщение об ошибке

PHP Fatal error:  Cannot use Cumuru\MinimalExample\ToBeImported\Bar as Bar because the name is already in use in .../src/Main/Foo.php on line     4
PHP Stack trace:
PHP   1. {main}() .../index.php:0
PHP   2. spl_autoload_call() .../index.php:6
PHP   3. Composer\Autoload\ClassLoader->loadClass() .../index.php:6
PHP   4. Composer\Autoload\includeFile() .../vendor/composer/ClassLoader.php:322

Если вы действительно хотите запустить код, посмотрите это репозиторий на github!

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

ошибка в конкретной версии PHP, которая сейчас устарела

Интересно, правда ли это, или это просто деталь реализации PHP 7 для обработки импорта на уровне файлов, который может быть изменен в будущем (снова нарушая код).

Редактировать:

Я знаю о возможности псевдонимов имен классов через use Cumuru\MinimalExample\ToBeImported\Bar as ImportedBar;,

Моя проблема в том, что происходит, если класс Cumuru\MinimalExample\Main\Bar создается последним, при этом оба других класса остаются неизменными. Учебный класс Foo будет роковым тогда - если и только если, класс Cumuru\MinimalExample\Main\Bar был создан до класса Foo загружен (в том же запросе / процессе).

0 ответов

Другие вопросы по тегам