PSR-2 代码风格规范

From: https://blog.csdn.net/qq_28602957/article/details/52248239

这篇规范是PSR-1(基本代码规范)的扩展和继承。

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

这个风格规范是从各种各样的项目的共性中延伸出来的。当多名程序员在多个项目中合作时,它有助于有一套准则,在所有的项目中使用。

因此,本指南的好处不是在规则本身,而是在这些规则的共享。

关键词 “必须”(“MUST”)、“一定不可/一定不能”(“MUST NOT”)、“需要”(“REQUIRED”)、
“将会”(“SHALL”)、“不会”(“SHALL NOT”)、“应该”(“SHOULD”)、“不该”(“SHOULD NOT”)、
“推荐”(“RECOMMENDED”)、“可以”(“MAY”)和”可选“(“OPTIONAL”)的详细描述可参见 RFC 2119

1.概览

  • 代码必须遵循PSR-1基本代码规范。
  • 代码必须使用四个空格符进行缩进,而不是一个tab键。
  • 每行应该保持在80个字符以内,软限制必须是120个字符,但一定不能有硬性限制。
  • 每个namespace命名空间声明语句和use声明语句块后面,必须有一个空白行。
  • 类的开始花括号({)必须写在函数声明后自成一行,结束花括号(})也必须写在函数主体后自成一行。
  • 方法的开始花括号({)必须写在函数声明后自成一行,结束花括号(})也必须写在函数主体后自成一行。
  • 在所有的属性和方法上都必须声明可见性(译者注:privateprotected以及public);abstractfinal必须声明在可见性之前;static必须声明在可见性之后。
  • 控制结构的关键词后面必须有一个空格符,方法和函数调用一定不能有。
  • 控制结构的开始花括号({)必须写在声明的同一行,而结束花括号(})必须写在主体后自成一行。
  • 控制结构的开始左括号({)之后一定不能有空格,右括号(})之前一定不能有空格。

1.1 例子

以下这个例子简单的展示了以上的大部分规范。

<?php
namespace Vendor\Package;use FooInterface;
use BarClass as Bar;
use OtherVendor\OtherPackage\BazClass;class Foo extends Bar implements FooInterface
{public function sampleFunction($a, $b = null){if ($a === $b) {bar();} elseif ($a > $b) {$foo->bar($arg1);} else {BazClass::bar($arg2, $arg3);}}final public static function bar(){// method body}
}

2. 通则

2.1 基本编码规范

代码必须符合PSR-1的所有规范

2.2 文件

所有PHP文件必须使用Unix LF (linefeed)作为行的结束符。

所有PHP文件必须以一个空白行结束。

纯PHP代码文件必须省略最后的 ?> 结束标签。

2.3 行

行的长度一定不能有硬性的约束。

行长度的软性约束一定限制在120个字符以内;如果超过此长度,代码规范检查器必须发出警告,一定不能报错。

每行不应该超过80个字符;超过80个字符的行,应该被拆分成多个不超过80个字符的后续行。

在非空白行的后面一定不能有多余的空格符。

空行可以用来改善可读性和区分相关的代码块。

每行一定不能多余一条语句。

2.4 缩进

代码必须使用四个空格符缩进,一定不能使用tab键。

备注:只用空格,不于tab混合使用,有助于避免代码差异、打补丁、重阅代码以及注释时产生混淆。使用空格还可以使调整细微的缩进来改变对齐变得简单。

2.5 关键字和True/False/Null

PHP关键字必须全部小写。

PHP常量true,false和null**必须**全部小写。

3. 命名空间以及Use声明

存在命名空间时,其后面必须有一个空白行。

所有的use,必须在命名空间后声明。

每条use声明语句,必须只有一个use关键字。

use声明语句块后面必须有一个空白行。

例如:

<?php
namespace Vendor\Package;use FooClass;
use BarClass as Bar;
use OtherVendor\OtherPackage\BazClass;// ... additional PHP code ...

4. 类、属性和方法

此处的“类”泛指所有的class类、接口以及traits可复用代码块。

4.1 扩展和继承

关键词extendsimplements必须和类名在同一行。

类开始的花括号({必须独占一行,类结束的花括号(}必须在类主体后独占一行。

<?php
namespace Vendor\Package;use FooClass;
use BarClass as Bar;
use OtherVendor\OtherPackage\BazClass;class ClassName extends ParentClass implements \ArrayAccess, \Countable
{// constants, properties, methods
}

implements的接口列表也可以分成多行,当这样做时,列表中的第一个接口必须放在下一行中,每行必须只有一个接口

<?php
namespace Vendor\Package;use FooClass;
use BarClass as Bar;
use OtherVendor\OtherPackage\BazClass;class ClassName extends ParentClass implements\ArrayAccess,\Countable,\Serializable
{// constants, properties, methods
}

4.2 属性

所有属性都必须声明可见性。

一定不能使用关键字var声明一个属性。

每条语句一定不能定义超过一个属性。

属性名称不应该以单个下划线作为前缀来表示属性是protectedprivate

一个属性的声明应该像下面这样。

<?php
namespace Vendor\Package;class ClassName
{public $foo = null;
}

4.3 方法

所有方法都必须声明可见性(访问修饰符)。

方法名称不应该以单个下划线作为前缀来表示是protectedprivate

方法名称后一定不能有空格符,其开始花括号必须独占一行,结束花括号也必须在方法主体后单独成一行。参数左括号后和右括号前一定不能有空格。

一个方法定义应该像下面这样,注意括号,逗号,空格和花括号的位置:

<?php
namespace Vendor\Package;class ClassName
{public function fooBarBaz($arg1, &$arg2, $arg3 = []){// method body}
}

4.4 方法参数

在参数列表中,每个逗号之前一定不能有空格,每个逗号之后必须有一个空格。

方法参数中,有默认值的,必须放到参数列表的末尾。

<?php
namespace Vendor\Package;class ClassName
{public function foo($arg1, &$arg2, $arg3 = []){// method body}
}

参数列表可以被拆分成分别有一次缩进的多行,这样,列表中的第一项必须放在下一行,每一行必须只放一个参数。

拆分成多行的参数列表后,结束括号以及方法开始花括号必须写在同一行,中间用一个空格分隔,一起自成一行。

<?php
namespace Vendor\Package;class ClassName
{public function aVeryLongMethodName(ClassTypeHint $arg1,&$arg2,array $arg3 = []) {// method body}
}

4.5 abstract,finalstatic

当存在时,abstractfinal声明必须放在可见性之前。

当存在时,static声明必须放在可见性后。

<?php
namespace Vendor\Package;abstract class ClassName
{protected static $foo;abstract protected function zim();final public static function bar(){// method body}
}

4.6 方法和函数调用

方法及函数调用时,方法名或函数名与左括号之间一定不能有空格,参数右括号前也一定不能有空格。在参数列表中,每个逗号之前一定不能有空格,每个逗号之后必须有一个空格。

<?php
bar();
$foo->bar($arg1);
Foo::bar($arg2, $arg3);

参数可以被拆分成多个有一个缩进的后续行,如果这么做,参数列表中的第一个必须放在下一行,并且每一行只能有一个参数。

<?php
$foo->bar($longArgument,$longerArgument,$muchLongerArgument
);

5. 控制结构

控制结构基本样式规范如下:

  • 控制结构关键词后必须有一个空格。
  • 左括号(后面一定不能有空格。
  • 右括号)一定不能有空格。
  • 右括号)和开始花括号{之间必须有一个空格。
  • 结构体必须缩进一次。
  • 结束花括号}必须在主体后自成一行。

每个结构体的主题都必须被包含在成对的花括号中,这使结构体看起来更加规范以及减少加入新行时,出错的可能性。。

5.1 if,elseif,else

一个if的结构如下所示。注意其括号、空格以及花括号的位置,并且elseelseif和前一个主体的结束花括号}在同一行。

<?php
if ($expr1) {// if body
} elseif ($expr2) {// elseif body
} else {// else body;
}

应该使用elseif代替else if,使得所有的控制关键词看起来像一个单词。

5.2 switchcase

一个switch结构如下所示。注意其括号、空格以及花括号的位置。case语句必须相对于switch进行一次缩进,break关键字(或其他终止关键字)必须case主体缩进同级。如果存在一个非空的case直穿语句,则必须有一个类似// no break的注释。

<?php
switch ($expr) {case 0:echo 'First case, with a break';break;case 1:echo 'Second case, which falls through';// no breakcase 2:case 3:case 4:echo 'Third case, return instead of break';return;default:echo 'Default case';break;
}

5.3 while,do while

一个while语句如下所示。注意其括号、空格以及花括号的位置。

<?php
while ($expr) {// structure body
}

同样,一个do while语句如下所示。注意其括号、空格以及花括号的位置。

<?php
do {// structure body;
} while ($expr);

5.4 for

一个for语句看起来像下面这个样子。注意其括号、空格以及花括号的位置。

<?php
for ($i = 0; $i < 10; $i++) {// for body
}

5.5 foreach

一个foreach语句看起来像下面这样。注意其括号、空格以及花括号的位置。

<?php
foreach ($iterable as $key => $value) {// foreach body
}

5.6 try,catch

一个try catch语句块看起来像下面这样。注意其括号、空格以及花括号的位置。

<?php
try {// try body
} catch (FirstExceptionType $e) {// catch body
} catch (OtherExceptionType $e) {// catch body
}

6. 闭包

闭包声明时,关键词function后以及关键词use的前后都必须有一个空格。

开始的花括号{必须写在声明的同一行,结束的花括号}必须紧跟在主体的下一行。

参数列表和变量列表的左括号后(以及右括号)前,一定不能有空格。

参数列表和变量列表中,逗号前一定不能有空格,逗号后必须有空格。

闭包带默认值的参数必须放在参数列表后面。

一个闭包声明看起来像下面这个样子。注意其括号、逗号、空格以及花括号的位置。

<?php
$closureWithArgs = function ($arg1, $arg2) {// body
};$closureWithArgsAndVars = function ($arg1, $arg2) use ($var1, $var2) {// body
};

参数和变量列表可以被拆分成多个有一次缩进的后续行,这样,列表中的第一个必须放在下一行并且每一行必须只有一个参数或变量。

当最终(无论是参数列表还是变量列表)被分成多行时,有括号)和左或括号{必须在他们中间隔一个空格,放在一起,自成一行。

以下几个闭包的例子,包含了参数和变量列表被分成多行的多情况。

<?php
$longArgs_noVars = function ($longArgument,$longerArgument,$muchLongerArgument
) {// body
};$noArgs_longVars = function () use ($longVar1,$longerVar2,$muchLongerVar3
) {// body
};$longArgs_longVars = function ($longArgument,$longerArgument,$muchLongerArgument
) use ($longVar1,$longerVar2,$muchLongerVar3
) {// body
};$longArgs_shortVars = function ($longArgument,$longerArgument,$muchLongerArgument
) use ($var1) {// body
};$shortArgs_longVars = function ($arg) use ($longVar1,$longerVar2,$muchLongerVar3
) {// body
};

注意:如果闭包在函数或方法中当做一个参数直接调用时,以上规则仍然适用。

<?php
$foo->bar($arg1,function ($arg2) use ($var1) {// body},$arg3
);

7. 结论

有许多元素的风格和实践在本指南中被故意忽略掉。这些包括但不限于:

  • 全局变量和常量的定义
  • 函数的定义
  • 操作符和赋值
  • 行内对齐
  • 注释和文档描述块
  • 类名的前缀及后缀
  • 最佳实践

未来的建议可能会修改和扩展本指南,以解决这些或其他元素的风格和实践。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/402798.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

API的非向后兼容性无论如何通常代表着一种比较差的设计

不管一个类库或者工具方法实现多么的好&#xff0c;如果无法做到向后兼容性&#xff0c;通常会给用户带来很大的升级成本&#xff0c;很多对此的依赖如果希望在后续的升级和维护期间使用该类库的其他新增特性或者好处&#xff0c;将不得不推迟升级亦或是被迫接受改变。 无论这个…

学习《css世界》笔记之使用css实现凹凸效果

显示效果 HTML <span class"ao"></span> <span class"tu"></span>CSS .ao,.tu{display: inline-block;width: 0;font-size: 14px;line-height: 18px;margin: 35px;/* color: #fff; *//* 文字颜色 */}.ao:before,/* :before的主…

第二届河南省大学生程序设计竞赛 Dr.Kong的机器人

Dr.Kong的机器人Dr.Kong设计了一个可以前进或后退机器人&#xff0c;该机器人在每个位置i会得到一个移动步数的指令Ki (i1,2„N),聪明的机器人自己会判断是要前进Ki步还是后退Ki步。例如&#xff1a;给定指令序列(3 3 1 2 5)&#xff0c;表示机器人在第1个位置时&#xff0c;可…

PHP操作Redis常用技巧

From: http://www.php.cn/php-weizijiaocheng-395387.html 这篇文章主要介绍了PHP操作Redis常用技巧,结合实例形式总结分析了php针对redis的连接、认证、string、hash等操作技巧与注意事项,需要的朋友可以参考下 本文实例讲述了PHP操作Redis常用技巧。分享给大家供大家参考&am…

IO调度算法

IO调度算法的选择 一) I/O调度程序的总结 1) 当向设备写入数据块或是从设备读出数据块时,请求都被安置在一个队列中等待完成. 2) 每个块设备都有它自己的队列. 3) I/O调度程序负责维护这些队列的顺序,以更有效地利用介质.I/O调度程序将无序的I/O操作变为有序的I/O操作. 4) 内核…

ORA-01555 原因与解决

ORA-01555 原因与解决&#xff1a; 前面提到了ORA-01555错误&#xff0c;那么现在来看一下ORA-01555错误是怎样产生的。由于回滚段是循环使用的&#xff0c;当事务提交以后&#xff0c;该事务占用的回滚段事务会被标记为非活动&#xff0c;回滚段空间可以被覆盖重用。那么一个问…

使用css优雅解决文字两端对齐的方式之一

效果图 HTML <body><div>学校</div><div>班级</div><div>班主任</div><div>上课时间</div><div>名字</div></body>CSS div {margin: 10px 0;width: 70px;border: 1px solid brown;text-align: just…

centos7 下安装Poco

参考&#xff1a; https://pocoproject.org/download.html 以下是我自己安装时的步骤&#xff0c;亲自实践&#xff01; 1. 下载 git clone -b master https://github.com/pocoproject/poco.git 2. 安装依赖包 切换至root用户 yum install mysql mysql-devel mysql # 我…

DPlist

DP大法&#xff08;之POJ&#xff09;&#xff1a; [1]POJ 动态规划题目列表 http://cippus.dlut.edu.cn/forum/posts/list/45.page容易&#xff1a; 1018,1050, 1083, 1088, 1125, 1143, 1157, 1163, 1178, 1179, 1189, 1208, 1276, 1322, 1414, 1456, 1458, 1609, 1644, 1664…

学习《css世界》笔记之loading三点动画效果

动画实例 HTML <div>正在加载中<span>...</span></div>CSS span {display: inline-block;height: 1em;line-height: 1;text-align: left;vertical-align: -0.25em;/* 属性设置元素的垂直对齐方式。指定为负长度&#xff0c;可以使元素降低 */overfl…

关于今天

今天天气晴朗,晴空万里,万里无云,哈哈... 早上起来的时候,大雾,妖风四起. 然后早上起来居然就玩了一天的 冰封要塞. 说说玩了后的心得吧. 推塔游戏,额,这是CF第一次推出的这种模式.可以说和dota和英雄联盟有些相似.估计是某人从dota和英雄联盟这么火的情况下想出来的这招. 推塔…

Mac下安装event库

因为使用的GatewayWorker框架使用了swoole&#xff0c;但swoole依赖于event&#xff0c;所以必须安装下event扩展&#xff01; 1. 最初使用brew install libevent安装了下&#xff0c;运行gatewayworker发现错误依然存在&#xff01; 2. 考虑到是php里使用event&#xff0c;所…

Road Construction

【题目描述】 某岛屿上有N个旅游景点&#xff0c;任意两个旅游景点之间能够连通&#xff0c;但道路部门正在对某条道路进行施工&#xff0c;禁止游客通行&#xff0c;为了使所有旅游景点依然能够正常开放&#xff0c;道路部门决定搭建一些临时桥梁&#xff0c;使得无论哪条道路…

学习《css世界》笔记之content自动添加开启闭合符号

实例 HTML <p lang"zh"><q>啦啦德玛西亚</q></p><p lang"en"><q>This book is very good!</q></p><p lang"no"><q>denne bog er fantasisk!</q></p><p class"…

Sybase用户登录以后的自动运行脚本

最近开始学习sybase&#xff0c;对学习过程中遇到的问题会在此做以记录&#xff0c;希望和大家共同来学习。 sybase&#xff08;ASE&#xff09;在用户登录之后可以指定自动运行一个脚本&#xff0c;执行指定的操作。一般为自定义的存储过程。 15.7之前的版本采用 添加&#xf…

php自动加载指定目录下的类文件

From: https://www.cnblogs.com/CpNice/p/4369399.html 网上找到的类&#xff0c;非常有用&#xff0c;文件名: autoload.php <?php /*** Created by PhpStorm.* User: zcm* Mail: zhouciming163.com* Date: 2018/10/10 上午10:20*/if(!defined(ROOTDIR)) {define(ROOTDI…

maven+jetty项目在tomcat部署

步骤1&#xff1a;项目打包 clean install 步骤二&#xff1a;拷贝war 包到tomcat下 步骤三&#xff1a;修改server.xml文件的端口 步骤四&#xff1a;启动tomcat,注意jetty的项目是不需要带项目名的&#xff0c;Tomcat的项目需要加上项目名。 温馨提示&#xff0c;在启动tomca…

学习《css世界》笔记之多行文本实现垂直居中

效果图 HTML <div class"box"><div class"content">具有行高实现的多行文字垂直居中效果&#xff0c;需要属性vertical-align帮助</div> </div>CSS .box{width: 200px;line-height: 120px;background-color: #f0f0f0;}.content{…

c++服务器websocket支持

From: https://blog.csdn.net/u010223072/article/details/80637127 介绍 目前公司服务器是c tcp的网络架构&#xff0c;现在想用这套做h5游戏&#xff0c;所以要扩展支持websocket通信。 那么什么是websocket&#xff1f;它和tcp有什么区别&#xff1f;这些随便一搜一大把&…

Ubuntu10.04制作官方源镜像以及搭建本地源

不能上网、网速慢、共享等等需求&#xff0c;使我们不能或者不想使Ubuntu10.04在线安装软件包&#xff0c;而是需要一个本地的更新源。通过apt-mirror工具&#xff0c;我们可以轻松制作官方源的本地镜像&#xff0c;通过本地镜像&#xff0c;我们可以本地安装更新软件. 1. 安装…