概述
本文档为更好的提高工作效率,保证开发的有效性和合理性,并可最大程度的提高程序代码的可读性和可重复利用性,指定此规范。
本规范基于PSR-[0-4]规范,结合团队实际产生。
PSR-1
- PHP源文件
必须只使用<?php和<?=这两种标签。 - 源文件中php代码的编码格式
必须是不带字节顺序标记(BOM)的UTF-8。 - 一个源文件
建议只用来做声明(类(class),函数(function),常量(constant)等)或者只用来做一些引起副作用的操作(例如:输出信息,修改.ini配置等),但不建议同时做这两件事。 - 一个源文件
建议只用来做声明(类(class),函数(function),常量(constant)等)或者只用来做一些引起副作用的操作(例如:输出信息,修改.ini配置等),但不建议同时做这两件事。 - 命名空间(namespace)和类(class) 必须遵守PSR-0标准。
- 类名(class name) 必须使用骆驼式(StudlyCaps)写法 (注:驼峰式(cameCase)的一种变种,后文将直接用StudlyCaps表示)。
- 类(class)中的常量必须只由大写字母和下划线(_)组成。
- 方法名(method name) 必须使用驼峰式(cameCase)写法。
PSR-2
1. 源文件
- 文件末尾必须空一行。
- 必须使用Unix LF(换行)作为行结束符。
- 纯PHP代码源文件的关闭标签
?>必须省略。 这可以避免在 PHP 结束标记之后万一意外加入了空格或者换行符,会导致 PHP 开始输出这些空白,而脚本中此时并无输出的意图。
2. 缩进
必须使用4个空格来缩进,不能使用Tab键。当然你如果把Tab在编辑器里手动设置为4个空格也可以。
3. 行
一行推荐的是最多写120个字符,多于这个字符就应该换行了,一般的编辑器是可以设置的。
4. 关键字和 True/False/Null
php的关键字,必须小写,boolean值:true,false,null 也必须小写
下面是php的keyword,必须小写。
'__halt_compiler', 'abstract', 'and', 'array', 'as', 'break', 'callable', 'case', 'catch', 'class', 'clone', 'const', 'continue', 'declare', 'default', 'die', 'do', 'echo', 'else', 'elseif', 'empty', 'enddeclare', 'endfor', 'endforeach', 'endif', 'endswitch', 'endwhile', 'eval', 'exit', 'extends', 'final', 'for', 'foreach', 'function', 'global', 'goto', 'if', 'implements', 'include', 'include_once', 'instanceof', 'insteadof', 'interface', 'isset', 'list', 'namespace', 'new', 'or', 'print', 'private', 'protected', 'public', 'require', 'require_once', 'return', 'static', 'switch', 'throw', 'trait', 'try', 'unset', 'use', 'var', 'while', 'xor'
5. 命名空间(Namespace)和导入(Use)声明
先简单文字描述下:
- 命名空间(namespace)的声明后面必须有一行空行。
- 所有的导入(use)声明必须放在命名空间(namespace)声明的下面。
- 一句声明中,必须只有一个导入(use)关键字。
- 在导入(use)声明代码块后面必须有一行空行。
用代码来说明下:
1
2
3
4
5
6
7
8
9
10
11
| <?phpnamespace Lib\Databases; // 下面必须空格一行use FooInterface; //use 必须在namespace 后面声明use BarClass as Bar;use OtherVendor\OtherPackage\BazClass; // 下面必须空格一行class Mysql { //class body} |
6. 类(class),属性(property)和方法(method)
1 . 继承(extends) 和实现(implement) 必须和 class name 写在一行,切花括号要换行写。
1
2
3
4
5
| <?phpnamespace Lib\Databaes;class Mysql extends ParentClass implements \PDO, \DB // 写一行{ //换行写{} |
2 . 属性(property)必须声明其可见性,到底是
public 还是protected还是 private不能省略,也不能使用var, var是php老版本中的什么方式,等用于public.
1
2
3
4
5
6
7
8
9
| <?phpnamespace Lib\Databaes;class Mysql extends ParentClass implements \PDO, \DB // 写一行{ public $foo = null; private $name = 'yangyi'; protected $age = '17';} |
3 . 方法(method) ,必须 声明其可见性,到底是
public 还是protected还是 private,不能省略。并且,花括号{必须换行写。如果有多个参数,第一个参数后紧接, ,再加个空格,且函数name和( 之间没有空格:function_name($par, $par2, $pa3), 如果参数有默认值,也要用左右空格分开。
1
2
3
4
5
6
7
8
9
10
| <?phpnamespace Lib\Databaes;class Mysql extends ParentClass implements \PDO, \DB // 写一行{ public function getInfo($name, $age, $gender = 1) //函数名getInfo和(之间没有空格,参数之间要有空格。默认参数也要左右都有空格 { //必须换行写{ }} |
4 . 当用到抽象(abstract)和终结(final)来做类声明时,它们必须放在可见性声明 (
public 还是protected还是private)的前面。而当用到静态(static)来做类声明时,则必须放在可见性声明的后面。
1
2
3
4
5
6
7
8
9
10
11
12
| <?phpnamespace Vendor\Package;abstract class ClassName{ protected static $foo; //static放后面 abstract protected function zim(); //abstract放前面 final public static function bar() //final放前面,static放最后。 { // 方法主体部分 }} |
7.控制结构
1 . if,elseif,else写法
1
2
3
4
5
6
7
8
| <?phpif ($expr1) { //左右空格 // if body} elseif ($expr2) { //elesif 连着写 // elseif body} else { // else body;} |
2 .
switch,case 注意左右空格和换行
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| <?phpswitch ($expr) { //左右空格 case 0: echo 'First case, with a break'; //对其 break; //换行写break ,也对其。 case 1: echo 'Second case, which falls through'; // no break case 2: case 3: case 4: echo 'Third case, return instead of break'; return; default: echo 'Default case'; break;} |
3 .
while,do while
1
2
3
4
5
6
7
| <?phpwhile ($expr) { //左右空格 // structure body}do { // structure body; //左右空格} while ($expr); |
4 .
for的写法
1
2
3
4
| <?phpfor ($i = 0; $i < 10; $i++) { //注意几个参数之间的空格 // for body} |
5 .
foreach的写法
1
2
3
4
| <?phpforeach ($iterable as $key => $value) { //还是空格问题 // foreach body} |
6 .
try catch的写法
1
2
3
4
5
6
7
8
| <?phptry { // try body} catch (FirstExceptionType $e) { //同样也是注意空格。 // catch body} catch (OtherExceptionType $e) { // catch body} |
PSR - 3
PSR-3规范主要是来规范日志接口,这里不再详细叙述,实际工作日志以框架日志接口为准。可参考官网PSR-3规范。
PSR-4
1. 废除了PSR-0中
2. 类文件名要以 .php 结尾。
3. 类名必须要和对应的文件名要一模一样,大小写也要一模一样。
_就是目录分割符的写法,_下划线在完全限定类名中是没有特殊含义了。2. 类文件名要以 .php 结尾。
3. 类名必须要和对应的文件名要一模一样,大小写也要一模一样。
附录:
PSR 官方网站。
PSR 中文站。