PHP 5.6
这段代码:
<?php
namespace Database
{
    abstract class Model
    {
    }
}
namespace Models
{
    use Database\Model as DbModel;
    class Model extends DbModel
    {
    }
}
namespace Models
{
    use Database\Model;
    class Brand extends Model
    {
    }
}
namespace
{
    $m = new \Models\Model();
}
导致错误:
"致命错误:无法使用Database\Model作为模型,因为该名称已在第23行的D:\ OpenServer\domains\localhost\index.php中使用".
这段代码:
<?php
namespace Models
{
    use Database\Model as DbModel;
    class Model extends DbModel
    {
    }
}
namespace Models
{
    use Database\Model;
    class Brand extends Model
    {
    }
}
namespace Database
{
    abstract class Model
    {
    }
}
namespace
{
    $m = new \Models\Model();
}
没有错误.
为什么会这样?因为代码没有改变.
命名空间子句的顺序在这里有所不同; 在第一个示例中,Databasenamespace子句在定义类的子句之前声明Models\Model.
可以在文档中找到类似的差异示例:
(...)但是,下一个示例会在名称冲突时导致致命错误,因为MyClass与use语句在同一文件中定义.
通过分别移动Database下方或上方的命名空间来模拟此处的单独文件或相同文件.
也就是说,文档还说明:
作为将多个名称空间组合到同一文件中的编码实践,强烈建议不要这样做.主要用例是将多个PHP脚本组合到同一个文件中.
有趣的是,这个问题也是Drupal 8开发人员最近发现的问题,但根据这个错误报告,它已经在两年多前报道过了.
一拉请求已提交到解决的下一个主要版本这个问题(也可能是向后移植到5.x以及).
经过几次测试: 具有很少命名空间的 PHP 文件表现得难以理解,尽量不要在一个文件中使用多个命名空间。
(这是因为在解析[一个文件!]时链接到不存在的类,改变了 PHP 解析的顺序,C++ 的东西[指针] - 我无法解释这一点。)
正如 PHP 文档所说:“作为一种编码实践,强烈建议不要将多个名称空间组合到同一个文件中。”
有关我所做的测试以及我们研究的文档的更多信息:
https://chat.stackoverflow.com/rooms/71776/discussion- Between-axiac-and-jack