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


How to use objects from other namespaces and how to import namespaces in 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();

强调ArrayObject 不是在Foo'Bar命名空间中定义的;

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

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

如您所见,在创建对象之前添加了use ArrayObject;,以便从全局命名空间导入ArrayObject。使用use,你不需要(也不应该)添加前导反斜杠,但它的工作原理与use 'ArrayObject;相同,因此上面的代码在逻辑上相当于:

namespace Foo'Bar;
use 'ArrayObject;
$obj = new ArrayObject();
但是,正如我所说的,在导入命名空间时不应该使用前导反斜杠。引用PHP手册:

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