PHP 属性与文档块注释有何不同?

How are PHP attributes different from doc block annotations?

最近,attributes RFC 通过了投票阶段。它们与 DocBlock 注释有何不同,它们将带来什么好处?

考虑简单的 Doctrine 实体,之前:

/**
 * @ORM\Entity
 */
class Entity {
    …
}

之后:

<<ORM\Entity>>
class Entity {
    …
}

RFC 这部分的解释:Why not extending Doc Comments? 解释了很多好处

  • 命名空间防止使用相同文档注释标签的不同库之间发生冲突
  • 与不可预测的 strstr 性能甚至解析 docblock 相比,检查属性是否存在是 O(1) 哈希键测试。
  • 将属性映射到 类 可确保正确键入属性,减少运行时依赖文档块的主要错误来源。
  • 基于在许多不同的工具和社区中的普遍使用,对诸如注释之类的东西的需求是显而易见的。然而,这对于新人来说在评论中看到总是令人困惑的事情。此外,/* 和 /** 之间的差异仍然是一个非常微妙的错误来源。

其中很多归结为属性可以通过 PHP 检查的事实。工具可以利用这样一个事实,即这些属性是通过反射可见的已解析元数据,而不是需要使用每个工具的自定义语法进行解析的注释。 IDE 和静态分析工具将能够保证正确性,而无需了解特定工具的文档块注释语法,因为属性解析为必须存在的 类,并且可能具有进一步的类型注释以添加检查。

所以:

  • 定义他们使用的属性的工具将受益于正确性和性能提升,因为 PHP 将为他们处理这些属性的解析
  • 分析 PHP 的工具将受益于更简单的类型检查保证和检查属性正确性的标准
  • 人类将受益于这些工具的改进以及文档和元数据可以更好地分离这一事实