PHP命名空间错误?

时间:2015-02-26 11:09:17

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

导致错误:

  

“致命错误:无法将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();
}

没有错误。

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

2 个答案:

答案 0 :(得分:6)

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

可以在documentation

中找到这种差异的类似示例
  

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

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

尽管如此,文档也states

  

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

更新

有趣的是,这个问题最近也是Drupal 8开发人员found out的问题,但根据这个bug report,这个问题在两年多前就有报道。

已经提交pull request来解决下一个主要版本的问题(也可能会将其移植到5.x)。

答案 1 :(得分:1)

经过一些测试: 具有少量命名空间的PHP文件很难理解,尝试不在一个文件中使用多个命名空间。

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

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

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

http://chat.stackoverflow.com/rooms/71776/discussion-between-axiac-and-jack