【问题标题】:PHP Namespace Syntax: What is the Difference with Braces vs. without Braces?PHP 命名空间语法:带大括号和不带大括号的区别是什么?
【发布时间】:2013-03-11 00:17:24
【问题描述】:

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

没有大括号

namespace foo/bar;
class Any{}

带大括号

namespace foo/bar {
   class Any{}
}

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

【问题讨论】:

  • 我想知道为什么要关闭它?这似乎是一个清晰、有用、可回答的问题,其答案不仅仅是粗略地浏览一下文档即可找到。 Namespaces OverviewDefining Namespaces 页面甚至没有提到括号中的语法 exists,这就留下了一个问题,即那里记录的几个事实是否适用于括号内的语法或仅适用于未括号内的语法。我已投票决定重新开放并鼓励其他人也这样做。

标签: php namespaces


【解决方案1】:

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

<?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】:

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

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

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

    根据 php 指南,不建议这样做,如果可以,请将其保留在每个文件的一个命名空间中。

    【讨论】:

    • "如果一个文件中有多个命名空间" => 不带括号的语法也允许这样做。
    【解决方案3】:

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

    namespace {
        // code is in global scope
    }
    

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

    【讨论】:

    【解决方案4】:

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

    【讨论】:

    • 不,该文件中的所有类都将在该命名空间中
    猜你喜欢
    • 1970-01-01
    • 2014-09-30
    • 2011-04-08
    • 1970-01-01
    • 2017-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-01
    相关资源
    最近更新 更多