PSR 12 编码风格指南补充 - 说明文档 「审阅中」

1. 摘要

本文档描述了创建编码风格补充 PSR 的过程和讨论。目标是解释每个决定背后的原因

2. 何必?

PSR-2 于 2012 年被接受,自那时起,PHP 语言做出做了一系列的更改,其中最引人注目的是 PHP 7 的最新变化,这深深影响了 PHP 编码风格指南

虽然 PSR-2 非常全面地介绍了编写规范时已经存在的 PHP 功能,但新功能非常易于解释。

PSR-12 寻求提供一种编码风格工具可以实现的设置方式,项目可以声明遵守这些编码风格从而减少认知摩擦,然后开发人员可以轻松地协调不同项目

PSR-2 是根据当时 PHP-FIG 项目的常见做法创建的,最终的规范对是许多不同项目指导方针的妥协。 改变项目的编码准则以遵循 PSR-2 规范 ( 几乎所有项目都与PSR-1保持一致,即使没有明确说明 ) 所 带来的影响太大了 ( 失去了 git 历史,巨大的变更集和破坏了现有的补丁/拉取请求 )

PSR-2 要求采用者重新格式化大量阻碍采用的现有代码。 为了帮助 PSR-12 解决这个问题,我们采用了更具说明性的方法,并且在发布新语言功能时就定义了标准。 我们希望它有更好的被采用的机会,因为这个规范是在编写大量代码之前定义的。

然而,由于缺乏独立性,我们的目标是在 PSR-12 中应用 PSR-2 样式、解释和立场 ( 第 4 节中介绍 ),而不是建立新的约定

3. 正文

3.1. 目标

此 PSR 和 PSR-2 有着共同的目标

本规范希望通过制定一系列规范化 PHP 代码的规则,以减少在浏览不同作者的代码时,因代码风格的不同而造成不便

此 PSR 是 PSR-2 的延伸,因此也是 PSR-1 的延伸。 PSR-12 的基础是 PSR-2,因此下面会提供了一系列差异来帮助进行移植,但它应该被视为一个独立的规范。

此 PSR 将包含 PSR-2 发布后添加到 PHP 中的新功能相关的编码风格指南,包括 PHP 5.5,PHP 5.6 和 PHP 7.0。 正如 PSR-2 勘误中所述,此 PSR 还将包含有关 PSR-2 文本的说明

3.2. 非目标

此 PSR 并不打算创建全新的编码风格指南。

PSR-12 也不会改变 PSR-1 和 PSR-2 中规定的任何内容

4. 方案

总体的方案是尝试将现有的 PSR-2 样式和基本原理应用到新功能中,而不是建立新的约定

4.1. 严格类型声明

曾经有一个关于是否在 标准中强制使用严格类型的讨论。 所有人都同意我们只应使用 MUST 或 MUST NOT 语句,并避免使用 SHOULD 语句,并且没有人想说不能声明严格类型。

讨论的是它是否应该被视为一种应该被覆盖的编码风格项目,或者它是否超出了范围。

最后的决定是它超出编码风格指南的范围

4.2. 最终 ( Finally ) 和返回类型声明中的空白符

提出了许多不同的选项,可以在这里查看 返回类型声明 or 最终 ( finally ) 块

作出这些选择的原因是为了和来自 PSR-2 的 PSR-12 中的其它部分保持一致

4.3. 为所有类型关键字强制使用简写形式

PHP 7.0 引入了 标量类型声明,但它并不支持长类型的别名。 因此,强制使用主要的短型格式可以统一语法和防止可能的混淆。

4.4. 公开调查

为了使用数据来解决问题,我们进行了一些调查,收集了包括 17 名项目代表在内的 142 人的回复

4.4.1. FIG 代表投票结果

代表 项目 复合命名空间的深度不能超过 1 头部声明分组和排序 声明语句必须各自独占一行 PHP 文件中的声明语句可以包含标记 声明语句没有空白符 块声明语句格式 new 关键用法,需要括号 返回类型声明格式 use 声明中不许有前导的斜杠 命名空间声明块的格式 一般操作符空格 Try, Catch, Finally 格式 匿名类声明格式 关键字大小写, 只允许小写 关键字类型,只允许简短格式
Alexander Makarov Yii 框架
Korvin Szanto concrete5
Leo Feyer Contao
Larry Garfield Drupal
André R. eZ
Jan Schneider Horde
Karsten Dambekalns Neos and Flow
Andres Gutierrez Phalcon
Ryan Thompson PyroCMS
Matteo Beccati Revive Adserver
Damian Mooyman SilverStripe
Brian Retterer Stormpath PHP SDK
Matthew Weier O'Phinney Zend 框架
Jordi Boggiano Composer
Ben Marks Magento
Chuck Burgess PEAR
总计: 13/3 15/1 15/1 13/3 14/2 15/1 14/2 15/1 14/2 14/2 15/1 16/0 15/1 15/1 15/1

4.4.2. 一般非代表投票者

问题 通过 反对 通过比例
复合命名空间需要深度 114 12 89.47%
头部声明分组和排序 113 13 88.5%
声明语句必须各自独占一行 120 6 95%
PHP 文件中的声明语句可以包含标记 119 7 94.12%
声明语句没有空白符 116 10 91.38%
块声明语句格式 118 8 93.22%
new 关键用法,需要括号 116 10 91.38%
返回类型声明格式 115 11 90.43%
use 声明中不许有前导的斜杠 118 8 93.22%
命名空间声明块的格式 120 6 95%
一般操作符空格 123 3 97.56%
Try, Catch, Finally 格式 124 2 98.39%
匿名类声明格式 117 9 92.31%
关键字大小写, 只允许小写 124 2 98.39%
关键字类型,只允许简短格式 121 5 95.87%

4.5. 多行函数参数混合多行返回

邮件列表中有人提出了潜在的 可读性问题

我们复查了规范中所有可以带来更好可读性的变更选项,其中最亮眼的变更选项是: 如果参数和返回都是多行的话,则需要在函数的开头括号后面添加一个空行。

另一些人则提出了相反的意见:此规范已允许自由决定要添加空行的位置

因此我们会将其留给实现人员自由决定。

5. 对比 PSR-2 的变更

请注意,此变更日志不是 PSR-2 的详细变化列表,但突出了最显着的变化。 这些变更应该被认为是一个新的规范,因此你应该阅读规范以充分理解其内容。

5.1. 新增的声明

  • 所有的关键字小写 - 章节 2.5
  • 所有类型关键字的简写格式 - 章节 2.5
  • Use 声明分组 - 章节 3
  • Use 声明块 - 章节 3
  • 声明语句/严格类型声明的用法 - 章节 3
  • 类实例化始终需要括号 - 章节 4
  • 返回类型声明 - 章节 4.5
  • 类型提示 - 章节 4.5
  • 添加最终块 ( finally block ) - 章节 5.6
  • 操作符 - 章节 6
  • 匿名类 - 章节 8

5.2. 澄清和勘误表

  • 在多个实例中调整 「 方法 」 为 「 方法和函数 」 - 始终
  • 调整对类和接口的引用以包含特征 ( trait ) - 始终
  • StudlyCaps 被澄清为 PascalCase - 章节 2.1
  • 最后一行 不能 为空,而是包含 EOL 字符 - 章节 2.2
  • 除 PSR 中明确禁止的地方外,可以通过添加空白行来提高可读性 - 章节 2.3
  • PSR-2 中关于多行参数的勘误表 - 章节 4
  • PSR-2 中关于扩展多个接口的勘误表 - 章节 4
  • 禁止在类的关闭/打开花括号之前/之后使用空白行 - 章节 4

6. 参与人员

6.1. 撰稿者:

  • Korvin Szanto

6.2. 发起者:

  • Chris Tankersley

6.3. 工作组成员:

  • Alessandro Lai
  • Alexander Makarov
  • Michael Cullum
  • Robert Deutz

6.4. 特别鸣谢

  • Michael Cullum for drafting the original specification
  • Alexandar Makarov for coordinating the draft during FIG 2.0
  • Cees-Jan Kiewiet for moral support

7. 表决结果

  • Entrance Vote: https://groups.google.com/forum/?utm_medium=email&utm_source=footer#!msg/php-fig/P9atZLOcUBM/_jwkvlYKEAAJ

8. 参考文档

注意:顺序是按照时间顺序排列

PHP 标准规范

关于   |   FAQ   |   我们的愿景   |   广告投放   |  博客

  简单教程,简单编程 - IT 入门首选站

Copyright © 2013-2022 简单教程 twle.cn All Rights Reserved.