PHP 命名空间错误?

PHP namespace error?

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();
}

导致错误:

"Fatal error: Cannot use Database\Model as Model because the name is already in use in D:\OpenServer\domains\localhost\index.php on line 23".

此代码:

<?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();
}

没有错误。

为什么会这样?因为代码没改。

您的名称空间子句的顺序在这里有所不同;在第一个示例中,Database 命名空间子句在 之前声明 定义 class Models\Model.

的子句

可以在 documentation:

中找到该差异的类似示例

(...) However, the next example causes a fatal error on name conflict because MyClass is defined in the same file as the use statement.

通过将 Database 命名空间分别移到下方或上方来模拟此处的单独文件或相同文件。

也就是说,文档也 states:

It is strongly discouraged as a coding practice to combine multiple namespaces into the same file. The primary use case is to combine multiple PHP scripts into the same file.

更新

有趣的是,这个问题是 Drupal 8 开发人员最近 found out as well, but according to this bug report 两年多前就报道过的。

已提交 pull request 以在下一个主要版本中解决此问题(它也可能被移植回 5.x)。

经过几次测试: PHP 命名空间很少的文件很难理解,尽量不要在一个文件中使用多个命名空间.

(这是因为在解析 [一个文件!] 时链接到不存在的 类,这改变了 PHP 解析的顺序,C++ 东西 [指针] - 我无法解释。 )

正如 PHP 文档所说: “强烈建议不要将多个名称空间组合到同一个文件中作为一种编码习惯。”

更多关于我所做的测试和我们研究的文档:

https://chat.whosebug.com/rooms/71776/discussion-between-axiac-and-jack