PHP命名空间语法:带括号和不带括号有什么区别?

16

PHP提供了两种声明命名空间的语法。您可以使用没有花括号的命名空间,也可以使用下面看到的带有花括号的命名空间。

不带花括号

namespace foo/bar;
class Any{}

带括号

namespace foo/bar {
   class Any{}
}

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


8
为什么会关闭这个问题呢?它似乎是一个清晰、有用、可回答的问题,需要认真查看文档才能找到答案。命名空间概述定义命名空间页面甚至没有提到中括号语法存在,这就让人不确定那些文档记录的几个事实是指适用于中括号语法还是只适用于非中括号语法。我已经投票要求重新打开,并鼓励其他人也这样做。 - Mark Amery
4个回答

11

每个情况都有不同的原因,PHP官网上有一个好的例子

如果在一个文件中有多个命名空间或需要在包含在命名空间中的代码之外有全局非命名空间代码,则使用花括号(curly brackets)将命名空间括起来。

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

根据PHP指南,不建议这样做,如果可以,请将一个文件中的命名空间保持为一个。


3
如果一个文件中有多个命名空间,非括号语法也允许这样做。 - Jon

6

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

在这种情况下,可以使用花括号:
namespace {
    // code is in global scope
}

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


1
在第一种变体中,每个文件只能使用一个命名空间。 => 错误。 - Jon
不是真的...请参见在同一文件中定义多个命名空间的示例1。 - Clive

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();
}
?>

尝试以非括号样式编写此代码


-2

我认为第一个仅包括“任何”类。但是第二个包括花括号中的所有类。


不,该文件中的所有类都将在该命名空间中。 - Robin Kanters

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接