代码之家  ›  专栏  ›  技术社区  ›  neubert

为什么8.0之前的PHP版本拒绝将命名空间“Random\namespace”作为无效语法?

  •  2
  • neubert  · 技术社区  · 1 年前
    <?php
    namespace Random\Namespace;
    

    当我在3v4l.org上运行此代码时( https://3v4l.org/kk0bD )它在PHP8.0.0+上运行良好,但在PHP>=5.4.0和PHP<8.0.0我得到这个错误:

    Parse error: syntax error, unexpected 'Namespace' (T_NAMESPACE), expecting identifier (T_STRING)
    

    我不明白。自PHP 5.3.0以来,名称空间就一直存在于PHP中。

    有什么想法吗?

    1 回复  |  直到 1 年前
        1
  •  9
  •   IMSoP    1 年前

    在PHP8.0之前,命名空间中的每个组件都被视为一个不同的名称,并且每个部分都不能使用 list of reserved keywords .

    在这种情况下,命名空间 Random\Namespace 包含保留名称“Namespace”作为其组件之一,因此被解析器拒绝。

    在PHP 8.0中, a change to the parser was introduced 其中整个命名空间名称被视为单个令牌(作为在尽可能少的上下文中保留关键字的一般趋势的一部分)。因此,对于PHP8.x,名称被一次性解析为“Random\Namespace”,这是不保留的。

    链接的提案指出,关键字 namespace 仍保留在 开始 的名称空间名称,因为这会在某些上下文中引起歧义,所以 namespace Namespace\Random; 仍然是一个错误。