如何使用其他名称空间中的对象以及如何在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),不需要使用前导反斜杠,因为导入名称必须是完全限定的,并不会相对于当前的命名空间进行处理。