PHP命名空间错误?

Mir*_*ron 7 php namespaces

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();
}
Run Code Online (Sandbox Code Playgroud)

导致错误:

"致命错误:无法使用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();
}
Run Code Online (Sandbox Code Playgroud)

没有错误.

为什么会这样?因为代码没有改变.

Ja͢*_*͢ck 6

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

可以在文档中找到类似的差异示例:

(...)但是,下一个示例会在名称冲突时导致致命错误,因为MyClass与use语句在同一文件中定义.

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

也就是说,文档还说明:

作为将多个名称空间组合到同一文件中的编码实践,强烈建议不要这样做.主要用例是将多个PHP脚本组合到同一个文件中.

更新

有趣的是,这个问题也是Drupal 8开发人员最近发现的问题,但根据这个错误报告,它已经在两年多前报道过了.

拉请求已提交到解决的下一个主要版本这个问题(也可能是向后移植到5.x以及).


Jer*_*ski 1

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

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

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

有关我所做的测试以及我们研究的文档的更多信息:

https://chat.stackoverflow.com/rooms/71776/discussion- Between-axiac-and-jack

  • PHP [有关命名空间的常见问题解答页面](http://php.net/manual/en/language.namespaces.faq.php#language.namespaces.faq.conflict) 警告问题中暴露的冲突。但它并没有解释为什么会发生这种情况。 (3认同)