概述
本文档为更好的提高工作效率,保证开发的有效性和合理性,并可最大程度的提高程序代码的可读性和可重复利用性,指定此规范。
本规范基于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
| <?php namespace 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
| <?php namespace 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
| <?php namespace 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
| <?php namespace 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
| <?php namespace 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
| <?php if ( $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
| <?php switch ( $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
| <?php while ( $expr ) { //左右空格 // structure body } do { // structure body; //左右空格 } while ( $expr ); |
4 .
for
的写法
1
2
3
4
| <?php for ( $i = 0; $i < 10; $i ++) { //注意几个参数之间的空格 // for body } |
5 .
foreach
的写法
1
2
3
4
| <?php foreach ( $iterable as $key => $value ) { //还是空格问题 // foreach body } |
6 .
try catch
的写法
1
2
3
4
5
6
7
8
| <?php try { // 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 中文站。