当前位置: 首页 > 面试题库 >

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

巢海
2023-03-14
问题内容

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

$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();

由于您尚未ArrayObjectFoo\Bar名称空间中定义,因此无法使用。

上面的代码与:

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;,在创建对象以从全局名称空间导入ArrayObject之前添加了该对象。使用use您不需要添加(也不应该)添加前导反斜杠,但是它的工作html" target="_blank">原理与以前一样,use \ArrayObject;因此上述代码在逻辑上等效于:

namespace Foo\Bar;

use \ArrayObject;

$obj = new ArrayObject();

但是,正如我所说的,不应在导入名称空间时使用反斜杠。为此引用PHP手册:

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



 类似资料:
  • 我希望在Atom中有一种替代Sublime文本包Php伴侣的方法,允许导入名称空间和类。 我试图弄清楚atom autocomplete php插件中的这个功能是如何工作的。 文档中列出了以下功能: 自动完成类名,并在需要时自动添加use语句 在游标下添加类的use语句(ctrl-alt-u) 所以当我需要在我的PHP文件中导入一个类时,我会使用 我会得到一系列选项,但我的列表中没有列出我需要的c

  • 问题内容: 当我尝试使用自动加载和命名空间时出现此错误: 致命错误:* 在 第10行的 /usr/local/www/apache22/data/public/php5.3/test.php中 找不到类’Class1’ * 谁能告诉我我在做什么错? 这是我的代码: Class1.php: test.php: 问题答案: Class1不在全局范围内。 请参见下面的工作示例: 编辑(2009-12-1

  • 问题内容: 我有以下格式的xml文档: 我需要使用lxml中的xpath检索所有元素。我的问题是我不知道如何使用空的名称空间。我尝试了以下示例,但没有用。请指教。 我尝试过的各种方法是: 要么 要么 在这一点上,我只是不知道该尝试什么。任何帮助是极大的赞赏。 问题答案: 这样的事情应该起作用: 另请参见http://lxml.de/xpathxslt.html#namespaces-and- pr

  • 我有一个关于ES6导入模块的问题。 我试图在我的Three.js代码中添加OrbitControl。由于OrbitControls是一个单独的模块,我需要在我的代码中分别导入它们,如下所示。它工作得很好。 然而 我首先想到的是 原因是, 据我所知,如果模块将某些内容导出为导出默认值, 我可以通过在“导入”代码中添加花括号来访问它们。 但是,它没有起作用,因此我假设“三个orbitcontrols”

  • 问题内容: 如何在JavaScript中创建名称空间,以使我的对象和函数不会被其他同名对象和函数覆盖?我使用了以下内容: 有没有更优雅或更简洁的方法? 问题答案: 我喜欢这个:

  • 问题内容: 我在命名空间和语句上遇到了一些麻烦。 我有三个文件:,和。 我正在尝试使用相对路径进行此操作,因此已将其放在所有类中: 在我的圈子课程中,我有以下内容: 如果使用这些语句,我不会出错。如果我尝试以下语句,则会得到: 致命错误:在第8行的/Users/shawn/Documents/work/sites/workspace/shape/Circle.php中找不到类’Shape \ Sh