php - 如何使用来自其他 namespace 的对象以及如何在 PHP 中导入 namespace

标签 php oop namespaces scope

这两行之间的主要区别是什么?:

$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/

相关文章:

php - PHP 中的 Css 不工作

excel - VBA 第一次创建类

vb.net - VB 在哪里存储其导入的命名空间?

function - 运行特定的 Clojure 命名空间函数?

azure - 删除 eventhub 和删除命名空间有什么区别?

PHP Excel Reader - 获取背景颜色

php - 如何通过 php 通知我的 iPhone 应用程序名称已添加到数据库中?

java - 对象初始化 - Java

python - 使用 __getattr__() 按需创建成员方法

php正则表达式替换HREF属性