当使用use
to import/alias namespace into the current namespace in PHP - 是否允许导入当前命名空间中确实存在但当前文件中未使用的类的名称?
PHP 5.6 和 7.x 在这里似乎表现不同。不幸的是,我根本不知道它是否被允许。如果它被禁止,我希望我的 IDE 检测到这种冲突(因为代码可能随时再次中断),否则它是 5.6 版中的 PHP 错误。
查看最少的代码来了解这个想法:
src/Main/Bar.php:
namespace Cumuru\MinimalExample\Main;
class Bar { }
src/ToBeImported/Bar.php
namespace Cumuru\MinimalExample\ToBeImported;
class Bar { }
src/Main/Foo.php
namespace Cumuru\MinimalExample\Main;
use Cumuru\MinimalExample\ToBeImported\Bar;
class Foo { }
索引.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