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

emi*_*mix 5 php annotations

最近,属性 RFC已经通过了投票阶段。它们与DocBlock注解有什么不同,它们会带来什么好处?

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

/**
 * @ORM\Entity
 */
class Entity {
    …
}
Run Code Online (Sandbox Code Playgroud)

后:

<<ORM\Entity>>
class Entity {
    …
}
Run Code Online (Sandbox Code Playgroud)

小智 7

RFC 这部分的解释:为什么不扩展文档注释?解释了很多好处

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

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

所以:

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

  • 我这样问是为了让其他人不必这样做。 (2认同)