当类与当前命名空间中的类冲突时,是否允许从PHP中的不同命名空间导入(通过使用)类?
在PHP中使用当类与当前命名空间中的类冲突时,是否允许从PHP中的不同命名空间导入(通过使用)类?,php,namespaces,php-7,php-5.6,name-collision,Php,Namespaces,Php 7,Php 5.6,Name Collision,在PHP中使用use将/alias名称空间导入当前名称空间时,是否允许导入到当前名称空间中确实存在但未在当前文件中使用的类的名称 PHP5.6和7.x在这里的表现似乎有所不同。不幸的是,我不知道这是否被允许。如果它被禁止,我希望我的IDE能够检测到这样的冲突(因为代码可能会在任何时候再次中断),否则这就是5.6版中的PHP错误 请参阅最低限度的代码以了解此想法: src/Main/Bar.php: namespace Cumuru\MinimalExample\Main; class Bar
use
将/alias名称空间导入当前名称空间时,是否允许导入到当前名称空间中确实存在但未在当前文件中使用的类的名称
PHP5.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 { }
index.php
// [initialize autoloading]
// the following line breaks the code
$bar = new \Cumuru\MinimalExample\Main\Bar();
$foo = new \Cumuru\MinimalExample\Main\Foo();
这段代码将在PHP5.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
如果您想实际运行代码,请参阅
我很幸运在部署之前检测到了这个bug,在我们的生产系统上找到它可能要花费我很多时间。我为我的IDE提交了一个bug报告,但是它的优先级被降低了,说它是一个错误
PHP中特定版本的bug,现在已经过时了
我想知道这是不是真的,或者这只是PHP7的一个实现细节,用于处理将来可能更改的每个文件的导入(使代码再次中断)
编辑:
我知道可以通过使用Cumuru\MinimalExample\ToBeImported\Bar作为ImportedBar来别名类名代码>
我的问题是,如果类Cumuru\minimaexample\Main\Bar
最后创建,而其他两个类都保持不变,会发生什么情况。类Foo
将是致命的-如果且仅当类Cumuru\MinimalExample\Main\Bar
在类Foo
加载之前(在相同的请求/过程中)已实例化。我创建了该代码的独立可运行版本,并且在5.6和7.1上出现了相同的错误。这是有道理的,因为人们不应该期望能够为两个不同的事物指定相同的名称。要使代码正常工作,请将其中一个BAr类别名为其他类,例如:使用Cumuru\MinimalExample\ToBeImported\BAr as SomethingElse;。你能展示一个你所看到的可运行的例子吗?类是否被组织在单独的文件中似乎很重要。同样,可以在github上找到一个可运行的示例:。我知道通过use
导入时可以选择别名。如果类Cumuru\minimaexample\Main\Bar
是最后创建的,则会出现问题-我必须(手动,不支持IDE!)检查同一命名空间中的所有文件是否存在可能的冲突。是的,请参阅安装示例的含义。我看不出你做错了什么,对不起:-/你有没有检查过php7的变更日志,看看是否有什么听起来像是导致它的原因?可能可以从那里回到5.6上的修复程序。我在PHP变更日志中找到的唯一相关修复程序是。但我认为这与致命事件无关,因为不管opcache状态如何,致命事件都会出现。我拼凑了一个独立的可运行版本的代码,在5.6和7.1上出现了相同的错误。这是有道理的,因为人们不应该期望能够为两个不同的事物指定相同的名称。要使代码正常工作,请将其中一个BAr类别名为其他类,例如:使用Cumuru\MinimalExample\ToBeImported\BAr as SomethingElse;。你能展示一个你所看到的可运行的例子吗?类是否被组织在单独的文件中似乎很重要。同样,可以在github上找到一个可运行的示例:。我知道通过use
导入时可以选择别名。如果类Cumuru\minimaexample\Main\Bar
是最后创建的,则会出现问题-我必须(手动,不支持IDE!)检查同一命名空间中的所有文件是否存在可能的冲突。是的,请参阅安装示例的含义。我看不出你做错了什么,对不起:-/你有没有检查过php7的变更日志,看看是否有什么听起来像是导致它的原因?可能可以从那里回到5.6上的修复程序。我在PHP变更日志中找到的唯一相关修复程序是。但我认为这并不相关,因为不管opcache的状态如何,致命事件都会出现。