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

PHP命名空间语法:大括号与不带大括号有什么区别?,php,namespaces,Php,Namespaces,PHP提供了两种用于声明名称空间的语法。可以使用不带大括号的命名空间,也可以使用大括号的命名空间,如下所示 不带大括号 namespace foo/bar; class Any{} namespace foo/bar { class Any{} } 带大括号 namespace foo/bar; class Any{} namespace foo/bar { class Any{} } 这两种使用名称空间的方法在功能或行为上是否存在差异,或者它们的工作方式/功能是否相同?每种

PHP提供了两种用于声明名称空间的语法。可以使用不带大括号的命名空间,也可以使用大括号的命名空间,如下所示

不带大括号

namespace foo/bar;
class Any{}
namespace foo/bar {
   class Any{}
}
带大括号

namespace foo/bar;
class Any{}
namespace foo/bar {
   class Any{}
}

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

每种情况都有不同的原因,有不同的原因


如果一个文件中有多个名称空间,或者需要在同一文件中包含全局非名称空间代码,作为名称空间中包含的代码,则在名称空间周围使用花括号


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


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

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

namespace {
    // code is in global scope
}

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

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

如何设置没有括号的全局名称空间

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


试着用无括号的方式写这段代码

我想知道为什么要关闭它?这似乎是一个清晰、有用、可回答的问题,其答案不只是粗略地浏览文档就能找到。和页面甚至没有提到括号内的语法存在,这就留下了一个问题,即这里记录的几个事实是适用于括号内的语法还是仅适用于无括号的语法。在第一个变体中,每个文件只能使用一个名称空间“=>false。不是true…请参见示例1“如果一个文件中有多个名称空间”=>非括号语法也允许这样做。不,该文件中的所有类都将在该名称空间中