这两行代码的主要区别是什么?:
$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),前导反斜杠是不必要的,也不建议使用,因为导入名称必须是完全限定的,并且不相对于当前命名空间进行处理。