本文档描述了导致扩展编码样式PSR的过程和讨论。其目标是解释每个决定背后的原因。
PSR-2在2012年被接受,从那时起,PHP已经发生了许多变化,最显着的是PHP 7的最新变化,这些变化对编码风格指南有影响。虽然PSR-2非常全面地介绍了编写本文时存在的PHP功能,但新功能对解释非常开放。PSR-12旨在提供一种既可以实现编码样式工具,又可以声明遵守的设置方式,并且开发人员可以轻松地在不同项目之间进行关联,从而减少认知摩擦。
PSR-2是基于当时PHP-FIG项目的常规实践而创建的,但最终这意味着它是许多不同项目指南的妥协。改变其编码指南与PSR-2一致的项目的影响(几乎所有项目都与PSR-1一致,即使没有明确说明)被认为太大了(丢失git历史,巨大的变更集和破坏现有的补丁/拉请求)。
PSR-2要求采用者重新格式化大量现有代码,这阻碍了采用。为了帮助缓解PSR-12的这个问题,我们采用了更为规范的方法,并在发布时定义了新语言功能的标准。
然而,由于缺乏想要独裁,我们的目标是在PSR-12中应用PSR-2造型,理由和立场(在第4节,方法中描述),而不是建立新的约定。
该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还将包括对PSR-2文本的澄清,如PSR-2勘误表中所述。
PSR的目的并不是要添加全新的编码风格指南,PSR-12也不会改变PSR-1和PSR-2中规定的任何内容。
总体方法是尝试将现有的PSR-2样式和基本原理应用于新功能,而不是建立新的约定。
讨论了是否应在标准https://github.com/cs-extended/fig-standards/issues/7中强制执行严格类型。所有人都同意我们应该只使用MUST或MUST NOT语句并避免使用SHOULD语句,没有人想说无法声明严格类型。讨论的是它是否应该被视为应该涵盖的编码风格项目,或者它是否超出范围并且决定超出编码风格指南的范围。
建议了许多不同的选项,它们可以在这里看到 返回类型声明或 这里的最终块, 并且由于与PSR-2的PSR-12规范的其他部分的一致性而选择了当前的实现。
PHP 7.0引入了标量类型声明 ,它不支持长类型别名。因此,有必要强制使用主要的短类型表单来使用统一的语法并防止可能的混淆。
为了使用数据解决问题,进行了调查,收集了包括17个项目代表在内的142人的回复:
代表 | 项目 | 绝不能使用深度为2或更大的复合名称空间 | 标题语句分组和排序 | 声明语句必须各自独立 | 在包含标记的PHP文件中声明语句 | 声明语句没有空格: declare(strict_types=1); |
阻止声明语句格式 | new 关键字用法,需要括号 |
返回类型声明格式 | 使用语句前导斜杠不允许 | 阻止命名空间声明格式 | 一般操作员间距 | 尝试,捕获,最后格式化 | 匿名类声明格式 | 关键字套管,仅限小写 | 键入关键字,仅限简短形式 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
亚历山大马卡罗夫 | Yii框架 | ✓ | ✓ | ✓ | ❌ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
Korvin Szanto | concrete5 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
Leo Feyer | Contao | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
拉里加菲尔德 | Drupal的 | ✓ | ✓ | ✓ | ✓ | ✓ | ❌ | ✓ | ✓ | ✓ | ❌ | ✓ | ✓ | ❌ | ✓ | ✓ |
安德烈·R | 的eZ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
Jan Schneider | 部落 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
Karsten Dambekalns | Neos和Flow | ✓ | ✓ | ✓ | ✓ | ❌ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
安德烈斯古铁雷斯 | 尔康 | ❌ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
莱恩汤普森 | PyroCMS | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ❌ | ❌ | ✓ | ✓ | ✓ | ✓ | ✓ |
Matteo Beccati | Revive Adserver | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ❌ | ✓ | ✓ | ✓ | ✓ |
达米安·莫伊曼 | SilverStripe | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
Brian Retterer | Stormpath PHP SDK | ✓ | ✓ | ✓ | ❌ | ❌ | ✓ | ❌ | ✓ | ❌ | ✓ | ✓ | ✓ | ✓ | ❌ | ❌ |
Matthew Weier O'Phinney | Zend框架 | ❌ | ✓ | ✓ | ❌ | ✓ | ✓ | ✓ | ❌ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
乔迪·博贾诺 | 作曲家 | ❌ | ❌ | ❌ | ✓ | ✓ | ✓ | ❌ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
本马克斯 | Magento的 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
查克伯吉斯 | 梨 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
总计: | 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 |
题 | 对于 | 反对 | 百分比 |
---|---|---|---|
复合命名空间需要深度 | 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% |
使用语句前导斜杠不允许 | 118 | 8 | 93.22% |
阻止命名空间声明格式 | 120 | 6 | 95% |
一般操作员间距 | 123 | 3 | 97.56% |
尝试,捕获,最后格式化 | 124 | 2 | 98.39% |
匿名类声明格式 | 117 | 9 | 92.31% |
关键字套管,仅限小写 | 124 | 2 | 98.39% |
键入关键字,仅限简短形式 | 121 | 五 | 95.87% |
邮件列表中提出了潜在的可读性问题。我们检查了可以提供更好可读性的规范更改选项,浮动选项是在函数的开括号之后需要一个空行,如果参数和返回都是多行的。相反,有人指出,此规范 已经允许您决定添加空行的位置,因此我们将把它留给实现者来决定。
请注意,此更改日志不是PSR-2更改的详细列表,但突出显示了最显着的更改。它应被视为新规范,因此您应阅读规范以全面了解其内容。
注意:顺序按时间顺序递减。