PHP命名空间语法:大括号与没有大括号的区别是什么?

时间:2013-03-21 13:02:38

标签: php namespaces

PHP提供了两种声明命名空间的语法。您可以使用没有大括号或大括号的命名空间,如下所示。

没有大括号

namespace foo/bar;
class Any{}

使用大括号

namespace foo/bar {
   class Any{}
}

这两种使用命名空间的方式的功能或行为是否存在差异,或者它们是否以相同的方式工作/运行?

4 个答案:

答案 0 :(得分:9)

每种情况都有不同的原因,有good example on the PHP site

在命名空间周围使用大括号的原因是,如果一个文件中有多个命名空间,或者您需要在与命名空间中包含的代码相同的文件中包含全局非命名空间代码。

此外,如果一个文件中有多个名称空间,也允许使用非括号内的语法。

根据php指南,不建议这样做,如果可以的话,只需将其保存到每个文件的一个命名空间即可。

答案 1 :(得分:5)

在第一个版本中,每个文件只能使用一个命名空间,而第二个版本允许使用多个命名空间。它们可以互换使用,并且可以在单个文件中多次出现以定义多个命名空间。在这种情况下,使用花括号的唯一原因是:

namespace {
    // code is in global scope
}

除了上面的示例之外,在单个文件中具有多个名称空间的潜在缺点是使用目录和文件名来解析要加载的类的自动加载器;因此,不建议每个文件都有多个命名空间,除非将多个脚本文件合并为一个。

答案 2 :(得分:0)

如何设置不带括号的全局名称空间?

<?php
declare(encoding='UTF-8');
namespace MyProject {

const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */  }
}

namespace { // global code
session_start();
$a = MyProject\connect();
echo MyProject\Connection::start();
}
?>

只需尝试使用非括号样式编写此代码

答案 3 :(得分:-2)

我认为第一个只包含“Any”类。但第二个包括大括号之间的所有类。