这两行之间的主要区别是什么?:
$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 以便使用更简单的语法:
namespace Foo\Bar;
use ArrayObject;
$obj = new ArrayObject();
如您所见,在创建对象之前添加了 use ArrayObject;
以从全局命名空间导入 ArrayObject。使用 use
您不需要添加(也不应该)添加前导反斜杠,但是它的工作原理与 use\ArrayObject;
相同所以上面的代码是等效的逻辑上:
namespace Foo\Bar;
use \ArrayObject;
$obj = new ArrayObject();
然而,正如我所说,不应在导入 namespace 时使用前导反斜杠。为此引用 PHP 手册:
Note that for namespaced names (fully qualified namespace names containing namespace separator, such as Foo\Bar as opposed to global names that do not, such as FooBar), the leading backslash is unnecessary and not recommended, as import names must be fully qualified, and are not processed relative to the current namespace.
关于php - 如何使用来自其他 namespace 的对象以及如何在 PHP 中导入 namespace ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24607045/