如何使用其他名称空间中的对象以及如何在PHP中导入名称空间

这两条线的主要区别是什么?

$obj = new ArrayObject(); 

 $obj = new \ArrayObject(); 

当我使用第一行时,我得到了一个错误: "Fatal error: Class '\Foo\Bar\ArrayObject' not found..." ,我不太确定为什么我得到这个错误? 第二行似乎已经解决了这个问题。

如果你使用:

 $obj = new ArrayObject(); 

这意味着ArrayObject是在当前命名空间中定义的。 您可以在全局名称空间中使用此语法(在当前作用域中未定义名称空间),或者如果ArrayObject在与当前作用域(例如Foo\Bar )相同的名称空间中定义。

如果你使用:

 $obj = new \ArrayObject(); 

这意味着ArrayObject是在全局命名空间中定义的。

在你的例子中,你可能有这样的代码:

 namespace Foo\Bar; $obj = new ArrayObject(); 

这将不起作用,因为您尚未在Foo\Bar名称空间中定义ArrayObject

上面的代码是一样的:

 namespace Foo\Bar; $obj = new \Foo\Bar\ArrayObject(); 

如果ArrayObject是在全局命名空间中定义的(可能在你的情况下),你需要使用代码:

 namespace Foo\Bar; $obj = new \ArrayObject(); 

强调在Foo\Bar名称空间中未定义ArrayObject;

还有一件事 – 如果你在当前命名空间的许多地方使用ArrayObject,那么每次添加反斜杠可能不太方便。 这就是为什么你可以导入命名空间,所以你可以使用更简单的语法:

 namespace Foo\Bar; use ArrayObject; $obj = new ArrayObject(); 

正如你看到的use ArrayObject; 在创build对象之前添加了从全局名称空间导入ArrayObject。 使用use你不需要添加(而不应该)添加反斜杠,但是它的工作方式与use \ArrayObject; 所以上面的代码在逻辑上等同于:

 namespace Foo\Bar; use \ArrayObject; $obj = new ArrayObject(); 

不过正如我所说的,不应该使用导入命名空间中的反斜杠。 引用PHP手册:

请注意,对于名称空间名称(包含名称空间分隔符的完全限定名称空间名称,如Foo \ Bar而不是全局名称,如FooBar),不需要使用前导反斜杠,因为导入名称必须是完全限定的,并不会相对于当前的命名空间进行处理。