返回斜杠以获取名称空间

时间:2014-03-22 12:41:55

标签: php

因此,在我的router.php文件中,我使用命名空间创建了一个runApp类的对象。一切都很好。

namespace Router;

// app/routes.php

$runApp= new \Core\runApp();

在这种情况下,反斜杠(new \ Core \ runApp())意味着我需要从我的命名空间Router查找并尝试在runApp命名空间中查找Core类。

但是,我也可以这样使用链接:

namespace Router;

use Core\runApp;

// app/routes.php

$runApp= new runApp();

但是,为什么在最后一种情况下我不需要设置\ befor命名空间(使用Core \ runApp)??

3 个答案:

答案 0 :(得分:1)

  

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

来自PHP - Using namespaces: Aliasing/Importing

当您使用use关键字时,名称空间不是相对的,它们必须是完全限定的 然而,在所有其他情况下,它与当前命名空间相关。

答案 1 :(得分:1)

使用"使用"声明你为你的班级定义了一个别名" runapp"。 所以它在PHP文件中可用。

如果你想解决一个类"在"之外,你只需要一个完整的命名空间类。并且它没有在使用声明中定义(以前别名)。

将use-statement视为快捷方式。

答案 2 :(得分:1)

\用于全局命名空间。

在第一个示例中,您不在全局命名空间中,而是位于Router命名空间中。如果要使用其他命名空间中的类,可以:

  • 指定完整的类名(及其名称空间)(示例1)
  • 或使用课程'命名空间(例2)

如果你在第二个例子$runApp = new \runApp()中写道,你将使用全局命名空间中的runApp类,它不存在。

当您有两个具有相同名称的类时,它很有用。示例:

use \Fooo\Bar;

$a = new \Foo\Bar(); // $a is a \Foo\Bar
$b = new Bar(); // $b is a \Fooo\Bar