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();
}
没有错误。
为什么会这样?因为代码没有改变。
答案 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