澳门新浦京娱乐游戏php编码规范

本指罗列了通用的PHP代码格式规则和建议,意在减少不同作者的编码风格差异带来的认知障碍。

PHP团队 编码规范 & 代码样式风格规范

说起码代码,刚上大学那会,老师就教导我们,要严格,规范的,把代码写好。代码如人,工工整整。提起规范化的代码,从一开始用命令行编辑C语言代码就开始控制,强制自己按照相关的标准来,所以,现在写代码,不规范都不行,还是为当时打下的好习惯给自己点个赞。

这里的风格约定衍生自若干成员项目。指南作者们在多个项目中协作,推动了这些指导条款落地。
指南的关键在于共享,而不是规则本身。

一、基本约定

现在写到了PHP,对于PHP,是否也有相关的代码规范呢,当然,你或许在阅读其他博客或者PHP相关文档的时候经常提到这几个名词,PSR-1,PSR-2之类的,这是PHP-FIG制定的推荐规范,今天,我们就来讲解下PHP的推荐标准,PSR(PHP
Standards Recommendation)。

文中涉及的关键词 “MUST 必须”, “MUST NOT 必须不”, “REQUIRED 必需”, “SHALL
会”, “SHALL NOT 不会”, “SHOULD 应该”, “SHOULD NOT 不应该”, “RECOMMENDED
推荐的”, “MAY 可能”, 和 “OPTIONAL 可选的” 在RFC 2119 中有具体描述.

1、源文件

(1)、纯PHP代码源文件只使用 <?php 标签,省略关闭标签 ?> ;

(2)、源文件中PHP代码的编码格式必须是无BOM的UTF-8格式;

(3)、使用 Unix LF(换行符)作为行结束符;

(4)、一个源文件只做一种类型的声明,即,这个文件专门用来声明Class,
那个文件专门用来设置配置信息,别混在一起写;

注:PHP-FIG已经废弃了第一份推荐规范,PSR-0,第一份推荐规范被新发布的PSR-4替代了。

概览

  1. 代码必需遵循 “基础编码标准” PSR [PSR-1]。
  2. 代码缩进必须使用 4 空格,而不是tab。
  3. 行长度必须无硬性限制; 软性限制必须为120字符;应该少于等于80字。
  4. namespace声明后必须有一个空行,use声明后也必须有一个空行。
  5. 类的{ 必须在类名的下一行, }必须在body的下一行。
  6. 方法的 { 必须在方法签名的下一行,} 必须在body的下一行。
  7. 所有的属性和方法都要设置可见性; abstract和
    final必须在可见性之前声明;static 必须在可见性后声明。
  8. 结构控制关键词后必须有一个空格; 方法和函数必须没有空格。
  9. 结构控制的 { 必须在同一行,} 必须在body的下一行。
  10. 结构控制的 ( 后必须有空格, 结构控制的 ) 前必须没有空格。

2、缩进

使用Tab键来缩进,每个Tab键长度设置为4个空格;

PSR-1 : 基本的代码风格 :

例子

下面是一个综合的例子,可以帮助你对规则有一个概略的认识。

<?php
namespace VendorPackage;

use FooInterface;
use BarClass as Bar;
use OtherVendorOtherPackageBazClass;

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()
    {
        // 方法 body
    }
}

3、行

一行推荐的是最多写120个字符,多于这个字符就应该换行了,一般的编辑器是可以设置的。

澳门新浦京娱乐游戏 1

基本规则

4、关键字 和 True/False/Null

PHP的关键字,必须小写,boolean值:true,false,null 也必须小写。

下面是PHP的“关键字”,必须小写:

‘__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’

PSR-2 : 严格的代码风格 :

基本编码标准

代码必须遵循PSR-1的条款。

5、命名

(1)、类名 使用大驼峰式(StudlyCaps)写法;

(2)、(类的)方法名 使用小驼峰(cameCase)写法;

(3)、函数名使用 小写字母 + 下划线 写法,如 function
http_send_post(); 

(4)、变量名 使用小驼峰写法,如 $userName;

澳门新浦京娱乐游戏 2

文件

  1. 所有文件必须使用 Unix LF (linefeed) 换行。
  2. 所有PHP文件必须使用单个空行结束。
  3. 只包含PHP的代码必须忽略php结束标记 ? >。

6、代码注释标签

如 函数注释、变量注释等,常用标签有
@package、@var、@param、@return、@author、@todo、@throws

必须遵守 phpDocument 标签规则,不要另外去创造新的标签,更多标签查看
phpDocument官网

PSR-3 : 日志记录器接口 :

  1. 行长度必须没有硬性限制。
  2. 长度的软性限制必须为120字符;自动代码风格检查必须将120字设置为警告,必须不能设置为错误。
  3. 行不应该超过80字符;超过这个长度的行应该切分为多个不超过80字符的行。
  4. 非空行的结束必须没有尾随空格。
  5. 为增强可读性,可增加空行来标志代码的关联性。
  6. 每行包含的语句必须不能超过1条。

7、业务模块

(1)、涉及到多个数据表 更新/添加
操作时,最外层要用事务,保证数据库操作的原子性;

(2)、Model层,只做简单的数据表的查询;

(3)、业务逻辑统一封装到 Logic层;

(4)、控制器只做URL路由,不要当作 业务方法 调用;

(5)、控制器层不能出现SQL操作语句,如 ThinkPHP框架的
where()、order() 等模型方法,

即,控制器中,不要出现类似这样的SQL语句:D(‘XXX’)->where()->order()->limit()->find();
 

where()、order()、limit() 等SQL方法只能出现在 Model层、业务层!

澳门新浦京娱乐游戏 3

缩进

  1. 代码必须使用 4 空格的缩进, 必须不用tab作为缩进。

注意:只使用空格,不用tab,有助于避免diffs,patches,
history和annotations的问题。使用空格也有助于对齐。

二、代码样式风格

PSR-4 : 自动加载 :

关键词(保留字) 和 true/false/null

  1. PHP保留字必须小写.
  2. PHP常量 true, false和 null 必须小写.

1、命名空间(Namespace) 和 导入(Use)声明

先简单文字描述下:

  1. 命名空间(namespace)的声明后面必须有一行空行;
  2. 所有的导入(use)声明必须放在命名空间(namespace)声明的下面;
  3. 一句声明中,必须只有一个导入(use)关键字;
  4. 在导入(use)声明代码块后面必须有一行空行;

用代码来说明下:

1
2
3
4
5
6
<?php
namespace LibDatabases; // 下面必须空格一行
  
class Mysql {
 
}

namespace下空一行,才能使用use,再空一行,才能声明class

1
2
3
4
5
6
7
8
9
10
<?php
namespace LibDatabases; // 下面必须空格一行
  
use FooInterface; // use 必须在namespace 后面声明
use BarClass as Bar;
use OtherVendorOtherPackageBazClass; // 下面必须空格一行
  
class Mysql {
 
}

澳门新浦京娱乐游戏 4

Namespace 和 Use 声明

  1. namespace 声明之后必须有空行。
  2. 所有use 声明,必须在namespace声明之后。
  3. 每个声明必须单独使用一个use。
  4. use声明区之后必须有一个空行。

例如:

<?php
namespace VendorPackage;

use FooClass;
use BarClass as Bar;
use OtherVendorOtherPackageBazClass;

// ... additional PHP code ...

2、类(class),属性(property)和方法(method)

(1)、继承(extends) 和实现(implement) 必须和 class name
写在一行,且花括号要换行写。

1
2
3
4
5
6
<?php
namespace LibDatabaes;
 
class Mysql extends ParentClass implements PDO, DB { // 写一行
     
}

(2)、属性(property)必须声明其可见性,到底是 public 还是 protected
还是 private,不能省略,也不能使用var,
var是php老版本中的什么方式,等用于public。

1
2
3
4
5
6
7
8
<?php
namespace LibDatabaes;
 
class Mysql extends ParentClass implements PDO, DB { // 写一行
    public $foo = null;
    private $name = 'yangyi';
    protected $age = '17';
}

(3)、方法(method),必须 声明其可见性,到底是 public 还是 protected
还是 private,不能省略。并且,花括号{必须换行写。如果有多个参数,第一个参数后紧接“,”
,再加一个空格:function_name ($par, $par2, $pa3),
如果参数有默认值,“=”左右各有一个空格分开。

1
2
3
4
5
6
7
8
<?php
namespace LibDatabaes;
 
class Mysql extends ParentClass implements PDO, DB { // 写一行
    public getInfo($name, $age, $gender = 1) { // 参数之间有一个空格。默认参数的“=”左右各有一个空格,) 与 { 之间有一个空格
 
    }
}

(4)、当用到抽象(abstract)和终结(final)来做类声明时,它们必须放在可见性声明
(public 还是protected还是private)的前面。而当用到静态(static)来做类声明时,则必须放在可见性声明的后面。

直接上代码:

1
2
3
4
5
6
7
8
9
10
11
<?php
namespace VendorPackage;
 
abstract class ClassName {
    protected static $foo; // static放后面
    abstract protected function zim(); // abstract放前面
 
    final public static function bar() { // final放前面,static放最后。
        // 方法主体部分
    }
}

上述网址需要连接vpn方能打开,没有vpn?去买一个吧,一年也就几十块钱。

类, 属性 和 方法

这里的“类”包括 class、interface 和 trait。

3、控制结构

控制接口,就是
if else while switch等。这一类的写法规范也是经常容易出现问题的,也要规范一下。

(1)、if,elseif,else写法,直接上规范代码吧:

1
2
3
4
5
6
7
8
<?php
if ($expr1) { // if 与 ( 之间有一个空格,) 与 { 之间有一个空格
 
} elseif ($expr2) { // elesif 连着写,与 ( 之间有一个空格,) 与 { 之间有一个空格
 
} else { // else 左右各一个空格
 
}

澳门新浦京娱乐游戏 ,(2)、switch,case 注意空格和换行,还是直接上规范代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
switch ($expr) { // switch 与 ( 之间有一个空格,) 与 { 之间有一个空格
    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
8
<?php
while ($expr) { // while 与 ( 之间有一个空格, ) 与 { 之间有一个空格
 
}
 
do { // do 与 { 之间有一个空格
 
} while ($expr); // while 左右各有一个空格

(4)、for的写法

1
2
3
4
<?php
for ($i = 0; $i < 10; $i++) { // for 与 ( 之间有一个空格,二元操作符 "="、"<" 左右各有一个空格,) 与 { 之间有一个空格
 
}

(5)、foreach的写法

1
2
3
4
<?php
foreach ($iterable as $key => $value) { // foreach 与 ( 之间有一个空格,"=>" 左右各有一个空格,) 与 { 之间有一个空格
     
}

(6)、try catch的写法

1
2
3
4
5
6
7
8
<?php
try { // try 右边有一个空格
 
} catch (FirstExceptionType $e) { // catch 与 ( 之间有一个空格,) 与 { 之间有一个空格
 
} catch (OtherExceptionType $e) { // catch 与 ( 之间有一个空格,) 与 { 之间有一个空格
 
}

今天给大家带来的主要是编码规范,PSR-1,PSR-2关于代码风格规范的。

继承 和 实现

extends 和 implements 关键字必须和类名在同一行声明。

类的 { 必须独占一行; } 必须在body的下一行。

<?php
namespace VendorPackage;

use FooClass;
use BarClass as Bar;
use OtherVendorOtherPackageBazClass;

class ClassName extends ParentClass implements ArrayAccess, Countable
{
    // constants, properties, methods
}

implements
多个接口时,接口列表可以被分到多行,每个子行有一个缩进。如果这么做,第一个接口必须在implements
下一行,每行只能有一个接口。

<?php
namespace VendorPackage;

use FooClass;
use BarClass as Bar;
use OtherVendorOtherPackageBazClass;

class ClassName extends ParentClass implements
    ArrayAccess,
    Countable,
    Serializable
{
    // constants, properties, methods
}

4、注释

(1)、行注释

// 后面需要加一个空格;

如果 // 前面有非空字符,则 // 前面需要加一个空格;

(2)、函数注释

参数名、属性名、标签的文本 上下要对齐;

在第一个标签前加一个空行;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
/**
 * This is a sample function to illustrate additional PHP
 * formatter options.
 *
 * @param        $one   The first parameter
 * @param int    $two   The second parameter
 * @param string $three The third parameter with a longer
 *                      comment to illustrate wrapping.
 * @return void
 * @author  52php.cnblogs.com
 * @license GPL
 */
function foo($one, $two = 0, $three = "String") {
 
}

PSR-1 基本代码风格

属性

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

Var 关键字必须不能用于声明属性。

每行必须只声明一个属性。

不应该通过前缀下划线来标示protected和private的属性。

例:

<?php
namespace VendorPackage;

class ClassName
{
    public $foo = null;
}

5、空格

(1)、赋值操作符(=,+=
等)、逻辑操作符(&&,||)、等号操作符(==,!=)、关系运算符(<,>,<=,>=)、按位操作符(&,|,^)、连接符(.)
左右各有一个空格;

(2)、if,else,elseif,while,do,switch,for,foreach,try,catch,finally 等
与 紧挨的左括号“(”之间有一个空格;

(3)、函数、方法的各个参数之间,逗号(”,”)后面有一个空格;

总览

  • Files MUST use only<?phpand<?=tags.

  • Files MUST use only UTF-8 without BOM for PHP code.

  • Files SHOULDeitherdeclare symbols (classes, functions, constants,
    etc.)orcause side-effects (e.g. generate output, change .ini
    settings, etc.) but SHOULD NOT do both.

  • Namespaces and classes MUST follow an “autoloading” PSR:
    [PSR-0,PSR-4].

  • Class names MUST be declared inStudlyCaps.

  • Class constants MUST be declared in all upper case with underscore
    separators.

  • Method names MUST be declared incamelCase.

方法

所有方法都必须声明可见性。

不应该通过前缀下划线来标示protected和private的方法。

声明方法时,方法名的后必须没有空格。 { 必须在同一行, }
必须在body的下一行。 (后必须没有空格,) 前必须没有空格。

一个方法声明的例子如下,注意 小括号,逗号,空格 和 花括号 的位置:

<?php
namespace VendorPackage;

class ClassName
{
    public function fooBarBaz($arg1, &$arg2, $arg3 = [])
    {
        // method body
    }
}

6、空行

(1)、所有左花括号 { 都不换行,并且 { 紧挨着的下方,一定不是空行;

(2)、同级代码(缩进相同)的 注释(行注释/块注释)前面,必须有一个空行;

(3)、各个方法/函数 之间有一个空行;

(4)、namespace语句、use语句、clase语句 之间有一个空行;

(5)、return语句

如果 return 语句之前只有一行PHP代码,return 语句之前不需要空行;

如果 return 语句之前有至少二行PHP代码,return 语句之前加一个空行;

(5)、if,while,switch,for,foreach、try 等代码块之间
以及 与其他代码之间有一个空行;

 


 

参考示例 汇总

参考1:

1
2
3
4
5
6
7
8
<?php
namespace LibDatabaes;
 
class Mysql extends ParentClass implements PDO, DB { // 写一行
    public getInfo($name, $age, $gender = 1) { // 参数之间有一个空格。默认参数的“=”左右各有一个空格,) 与 { 之间有一个空格
 
    }
}

参考2:

1
2
3
4
5
6
7
8
9
10
11
<?php
namespace VendorPackage;
 
abstract class ClassName {
    protected static $foo; // static放后面
    abstract protected function zim(); // abstract放前面
 
    final public static function bar() { // final放前面,static放最后。
        // 方法主体部分
    }
}

参考3:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
<?php
namespace libraryModel;
 
use libraryHelperImageHelper;
use libraryLogicUserMainLogic;
 
/**
 * 用户表 数据模型
 *
 * @package libraryModel
 */
class UserMainModel extends BasicModel {
     /**
     * 获得用户统计信息
     *
     * @param int $userId 用户ID
     * @return array
     */
    public function getUserCard($userId) {
        $userId = intval($userId);
        return UserMainLogic::instance()->getUserCard($userId);
    }
 
    /**
     * 根据Id 获取用户信息
     *
     * @param int    $userId 用户Id
     * @param string $field  显示字段
     * @return array
     */
    public function getByUserId($userId = 0, $field = '*') {
        if (empty($userId)) {
            return array();
        }
 
        $where = array(
            'id' => $userId
        );
        $info = $this->field($field)->where($where)->find();
 
        if (isset($info['image']) && isset($info['sex'])) {
            $info['image'] = ImageHelper::GetImageUrl($info['image'], $info['sex']);
        }
 
        return $info;
    }
}

参考4:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
$serv = new swoole_server("127.0.0.1", 9502);
 
// sets server configuration, we set task_worker_num config greater than 0 to enable task workers support
$serv->set(array('task_worker_num' => 4));
 
// attach handler for receive event, which have explained above.
$serv->on('receive', function($serv, $fd, $from_id, $data) {
    // we dispath a task to task workers by invoke the task() method of $serv
    // this method returns a task id as the identity of ths task
    $task_id = $serv->task($data);
    echo "Dispath AsyncTask: id=$task_idn";
});
 
// attach handler for task event, the handler will be executed in task workers.
$serv->on('task', function ($serv, $task_id, $from_id, $data) {
    // handle the task, do what you want with $data
    echo "New AsyncTask[id=$task_id]".PHP_EOL;
 
    // after the task task is handled, we return the results to caller worker.
    $serv->finish("$data -> OK");
});
 
// attach handler for finish event, the handler will be executed in server workers, the same worker dispatched this task before.
$serv->on('finish', function ($serv, $task_id, $data) {
    echo "AsyncTask[$task_id] Finish: $data".PHP_EOL;
});
 
$serv->start();

 澳门新浦京娱乐游戏 5

总结:所有左花括号 { 都不换行,并且 {
紧挨着的下方,一定不是空行!

 

上面的 代码样式规范,参考了 Java、JavaScript、Objective-C、Go
等开发语言的规范!

Java语言对中国程序员影响太深,大部分人还是习惯把 左花括号 style=”color: #ff0000″> 不换行!

PHP标签

PHP code MUST use the long<?php ?>tags or the short-echo<?= ?>tags;
it MUST NOT use the other tag variations.

方法参数

方法的形参列表中,
每个逗号前必须没有空格。有默认值的参数必须在参数列表的最后。

<?php
namespace VendorPackage;

class ClassName
{
    public function foo($arg1, &$arg2, $arg3 = [])
    {
        // method body
    }
}

参数列表可以切分为多行,每个子行要有一个缩进。如果这么做,第一个参数必须独占一行,每行只能有一个参数。

参数列表切分为多行时,右括号)和左花括号{必须在同一行,之前必须有一个空格。

<?php
namespace VendorPackage;

class ClassName
{
    public function aVeryLongMethodName(
        ClassTypeHint $arg1,
        &$arg2,
        array $arg3 = []
    ) {
        // method body
    }
}

编码

PHP code MUST use only UTF-8 without BOM.

abstract, final 和 static

abstract和final声明必须在可见性之前声明。
static声明必须在可见性之后。

<?php
namespace VendorPackage;

abstract class ClassName
{
    protected static $foo;

    abstract protected function zim();

    final public static function bar()
    {
        // method body
    }
}

作用,类、方法、常量不能让人产生歧义

A file SHOULD declare new symbols (classes, functions, constants, etc.)
and cause no other side effects, or it SHOULD execute logic with side
effects, but SHOULD NOT do both.

The following is an example of a file with both declarations and side
effects; i.e, an example of what to avoid:

<?php// side effect: change ini settingsini_set('error_reporting', E_ALL);// side effect: loads a fileinclude "file.php";// side effect: generates outputecho "<html>n";// declarationfunction foo(){    // function body}

The following example is of a file that contains declarations without
side effects; i.e., an example of what to emulate:

<?php// declarationfunction foo(){    // function body}// conditional declaration is *not* a side effectif (! function_exists('bar')) {    function bar()    {        // function body    }}

方法和函数调用

写方法或函数调用时,方法/函数名 和 左括号( 之间,必须没有空格, 右括号
)
之前必须没有空格。在参数列表中,逗号间必须没有逗号,每个逗号后必须有一个空格。

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

命名空间和类名

Each class is in a file by itself, and is in a namespace of at least one
level: a top-level vendor name.The term “class” refers to all classes,
interfaces, and traits(性状,类的部分实现).

Code written for PHP 5.3 and after
MUST use formal namespaces.

For example:

<?php// PHP 5.3 and later:namespace VendorModel;class Foo{}

控制结构

控制结构通常遵循以下风格:

  1. 控制结构关键词后必须有一个空格。
  2. 左括号后必须没有空格。
  3. 右括号前必须没有空格。
  4. 又括号和左花括号之间必须有一个空格。
  5. body必须有一层缩进。
  6. 右花括号必须在body下一行。
  7. 每个控制结构的body必须用花括号括起来。
    即保证外观统一,又减少了添加新行时引入的错误。

常量

Class constants MUST be declared in all upper case with underscore
separators. (全部大写,下面可以加下划线)For example:

<?phpnamespace VendorModel;class Foo{    const VERSION = '1.0';    const DATE_APPROVED = '2012-06-01';}

if, elseif, else

if 结构如下所示。注意括号、空格、花括号的位置;同时留意 else 和 elseif
与前一部分的 } 在同一行。

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

elseif关键字不应该被 else if 代替。

变量

This guide intentionally avoids any recommendation regarding the use
of$StudlyCaps,$camelCase, or$under_scoreproperty names.
(枫爷这里建议变量采用下划线,不要使用驼峰命名法)

switch, case

Switch结构如下所示。注意括号、空格和花括号的位置。 case
语句相对于switch必须有一个缩进, break关键字
或者其他终结性的关键字必须和case body在同一缩进层级。在非空的case
body,如果没有终结性语句,必须加上注释 // no break

<?php
switch ($expr) {
    case 0:
        echo 'First case, with a 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;
}

方法

Method names MUST be declared incamelCase().
(方法命名采用驼峰命名法)

while, do while

while结构如下所示。 注意括号、空格和花括号的位置。

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

do-while接口如下所示。 注意括号、空格和花括号的位置。

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

PSR-2 严格代码风格

用官网的话说,这是代码规范,PSR-1只是基本代码规范,如果大家只想要基本的,那下面的内容可以忽略哈,我个人建议还是按照此代码规范来。

for

for 结构如下所示。 注意括号、空格和花括号的位置。

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

总览

  • Code MUST follow a “coding style guide” PSR [PSR-1].

  • Code MUST use 4 spaces for indenting, not tabs.

  • There MUST NOT be a hard limit on line length; the soft limit MUST
    be 120 characters; lines SHOULD be 80 characters or less.

  • There MUST be one blank line after thenamespacedeclaration, and
    there MUST be one blank line after the block ofusedeclarations.

  • Opening braces for classes MUST go on the next line, and closing
    braces MUST go on the next line after the body.

  • Opening braces for methods MUST go on the next line, and closing
    braces MUST go on the next line after the body.

  • Visibility MUST be declared on all properties and
    methods;abstractandfinalMUST be declared before the
    visibility;staticMUST be declared after the visibility.

  • Control structure keywords MUST have one space after them; method
    and function calls MUST NOT.

  • Opening braces for control structures MUST go on the same line, and
    closing braces MUST go on the next line after the body.

  • Opening parentheses for control structures MUST NOT have a space
    after them, and closing parentheses for control structures MUST NOT
    have a space before.

foreach

foreach 结构如下所示。 注意括号、空格和花括号的位置。

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

举例

This example encompasses some of the rules below as a quick overview:

<?phpnamespace VendorPackage;use FooInterface;use BarClass as Bar;use OtherVendorOtherPackageBazClass;class Foo extends Bar implements FooInterface{    public function sampleMethod($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    }}

try, catch

try-catch区块如下所示。 注意括号、空格和花括号的位置。

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

基础风格

Code MUST follow all rules outlined inPSR-1.

Closure 闭包

声明闭包必须在function关键字后留一个空格,在use关键字前后各留一个空格。

左花括号必须在同一行, 右花括号必须在body的下一行。

参数或变量列表的左括号后 和 右括号前必须没有空格。

参数和变量列表的逗号前必须没有空格,每个逗号后必须有一个空格。

有默认值的参数必须排在最后。

闭包的声明如下所示。 注意括号,逗号,空格和花括号的位置:

<?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
);

文件

All PHP files MUST use the Unix LF line ending.

All PHP files MUST end with a single blank line.

The closing?>tag MUST be omitted from files containing only PHP.

或许你之前也写过PHP的代码,这里,PHP文件的最后不许要有空行,而且不允许使用?>结尾标签。

结语

本指南刻意忽略了许多风格和实践。包括但不限于:

  • 声明全局变量和全局常量。
  • 声明函数。
  • 操作符和赋值。
  • 行间对齐。
  • 注释和文档区。
  • 类名前后缀。
  • 最佳实践。

Future recommendations MAY revise and extend this guide to address those
or other elements of style and practice.

代码行长度

Lines SHOULD NOT be longer than 80 characters; lines longer than that
SHOULD be split into multiple subsequent lines of no more than 80
characters each.

附录A 调查

In writing this style guide, the group took a survey of member projects
to determine common practices. The survey is retained herein for
posterity.

缩进

Code MUST use an indent of 4 spaces, and MUST NOT use tabs for
indenting.

N.b.: Using only spaces, and not mixing spaces with tabs, helps to avoid
problems with diffs, patches, history, and annotations. The use of
spaces also makes it easy to insert fine-grained sub-indentation for
inter-line alignment.

调查数据

url,http://www.horde.org/apps/horde/docs/CODING_STANDARDS,http://pear.php.net/manual/en/standards.php,http://solarphp.com/manual/appendix-standards.style,http://framework.zend.com/manual/en/coding-standard.html,http://symfony.com/doc/2.0/contributing/code/standards.html,http://www.ppi.io/docs/coding-standards.html,https://github.com/ezsystems/ezp-next/wiki/codingstandards,http://book.cakephp.org/2.0/en/contributing/cakephp-coding-conventions.html,https://github.com/UnionOfRAD/lithium/wiki/Spec%3A-Coding,http://drupal.org/coding-standards,http://code.google.com/p/sabredav/,http://area51.phpbb.com/docs/31x/coding-guidelines.html,https://docs.google.com/a/zikula.org/document/edit?authkey=CPCU0Us&hgd=1&id=1fcqb93Sn-hR9c0mkN6m_tyWnmEvoswKBtSc0tKkZmJA,http://www.chisimba.com,n/a,https://github.com/Respect/project-info/blob/master/coding-standards-sample.php,n/a,Object Calisthenics for PHP,http://doc.nette.org/en/coding-standard,http://flow3.typo3.org,https://github.com/propelorm/Propel2/wiki/Coding-Standards,http://developer.joomla.org/coding-standards.html
voting,yes,yes,yes,yes,yes,yes,yes,yes,yes,yes,yes,yes,yes,yes,yes,no,no,no,?,yes,no,yes
indent_type,4,4,4,4,4,tab,4,tab,tab,2,4,tab,4,4,4,4,4,4,tab,tab,4,tab
line_length_limit_soft,75,75,75,75,no,85,120,120,80,80,80,no,100,80,80,?,?,120,80,120,no,150
line_length_limit_hard,85,85,85,85,no,no,no,no,100,?,no,no,no,100,100,?,120,120,no,no,no,no
class_names,studly,studly,studly,studly,studly,studly,studly,studly,studly,studly,studly,lower_under,studly,lower,studly,studly,studly,studly,?,studly,studly,studly
class_brace_line,next,next,next,next,next,same,next,same,same,same,same,next,next,next,next,next,next,next,next,same,next,next
constant_names,upper,upper,upper,upper,upper,upper,upper,upper,upper,upper,upper,upper,upper,upper,upper,upper,upper,upper,upper,upper,upper,upper
true_false_null,lower,lower,lower,lower,lower,lower,lower,lower,lower,upper,lower,lower,lower,upper,lower,lower,lower,lower,lower,upper,lower,lower
method_names,camel,camel,camel,camel,camel,camel,camel,camel,camel,camel,camel,lower_under,camel,camel,camel,camel,camel,camel,camel,camel,camel,camel
method_brace_line,next,next,next,next,next,same,next,same,same,same,same,next,next,same,next,next,next,next,next,same,next,next
control_brace_line,same,same,same,same,same,same,next,same,same,same,same,next,same,same,next,same,same,same,same,same,same,next
control_space_after,yes,yes,yes,yes,yes,no,yes,yes,yes,yes,no,yes,yes,yes,yes,yes,yes,yes,yes,yes,yes,yes
always_use_control_braces,yes,yes,yes,yes,yes,yes,no,yes,yes,yes,no,yes,yes,yes,yes,no,yes,yes,yes,yes,yes,yes
else_elseif_line,same,same,same,same,same,same,next,same,same,next,same,next,same,next,next,same,same,same,same,same,same,next
case_break_indent_from_switch,0/1,0/1,0/1,1/2,1/2,1/2,1/2,1/1,1/1,1/2,1/2,1/1,1/2,1/2,1/2,1/2,1/2,1/2,0/1,1/1,1/2,1/2
function_space_after,no,no,no,no,no,no,no,no,no,no,no,no,no,no,no,no,no,no,no,no,no,no
closing_php_tag_required,no,no,no,no,no,no,no,no,yes,no,no,no,no,yes,no,no,no,no,no,yes,no,no
line_endings,LF,LF,LF,LF,LF,LF,LF,LF,?,LF,?,LF,LF,LF,LF,?,,LF,?,LF,LF,LF
static_or_visibility_first,static,?,static,either,either,either,visibility,visibility,visibility,either,static,either,?,visibility,?,?,either,either,visibility,visibility,static,?
control_space_parens,no,no,no,no,no,no,yes,no,no,no,no,no,no,yes,?,no,no,no,no,no,no,no
blank_line_after_php,no,no,no,no,yes,no,no,no,no,yes,yes,no,no,yes,?,yes,yes,no,yes,no,yes,no
class_method_control_brace,next/next/same,next/next/same,next/next/same,next/next/same,next/next/same,same/same/same,next/next/next,same/same/same,same/same/same,same/same/same,same/same/same,next/next/next,next/next/same,next/same/same,next/next/next,next/next/same,next/next/same,next/next/same,next/next/same,same/same/same,next/next/same,next/next/next

关键字

PHPkeywordsMUST be in lower case.

The PHP constantstrue,false, andnullMUST be in lower case.

调查说明

indent_type: The type of indenting. tab = “Use a tab”, 2 or 4 = “number
of spaces”

line_length_limit_soft: The “soft” line length limit, in characters.
? = not discernible or no response, no means no limit.

line_length_limit_hard: The “hard” line length limit, in characters.
? = not discernible or no response, no means no limit.

class_names: How classes are named. lower = lowercase only,
lower_under = lowercase with underscore separators, studly =
StudlyCase.

class_brace_line: Does the opening brace for a class go on the same
line as the class keyword, or on the next line after it?

constant_names: How are class constants named? upper = Uppercase with
underscore separators.

true_false_null: Are the true, false, and null keywords spelled as all
lower case, or all upper case?

method_names: How are methods named? camel = camelCase, lower_under =
lowercase with underscore separators.

method_brace_line: Does the opening brace for a method go on the same
line as the method name, or on the next line?

control_brace_line: Does the opening brace for a control structure go
on the same line, or on the next line?

control_space_after: Is there a space after the control structure
keyword?

always_use_control_braces: Do control structures always use braces?

else_elseif_line: When using else or elseif, does it go on the same
line as the previous closing brace, or does it go on the next line?

case_break_indent_from_switch: How many times are case and break
indented from an opening switch statement?

function_space_after: Do function calls have a space after the
function name and before the opening parenthesis?

closing_php_tag_required: In files containing only PHP, is the
closing ?> tag required?

line_endings: What type of line ending is used?

static_or_visibility_first: When declaring a method, does static come
first, or does the visibility come first?

control_space_parens: In a control structure expression, is there a
space after the opening parenthesis and a space before the closing
parenthesis? yes = if ( expr),no=if(expr).

blank_line_after_php: Is there a blank line after the opening PHP
tag?

class_method_control_brace: A summary of what line the opening braces
go on for classes, methods, and control structures.

命名空间

When present, there MUST be one blank line after
thenamespacedeclaration.

When present, allusedeclarations MUST go after
thenamespacedeclaration.

There MUST be oneusekeyword per declaration.

There MUST be one blank line after theuseblock.

For example:

<?phpnamespace VendorPackage;use FooClass;use BarClass as Bar;use OtherVendorOtherPackageBazClass;// ... additional PHP code ...

调查结果

indent_type:
    tab: 7
    2: 1
    4: 14
line_length_limit_soft:
    ?: 2
    no: 3
    75: 4
    80: 6
    85: 1
    100: 1
    120: 4
    150: 1
line_length_limit_hard:
    ?: 2
    no: 11
    85: 4
    100: 3
    120: 2
class_names:
    ?: 1
    lower: 1
    lower_under: 1
    studly: 19
class_brace_line:
    next: 16
    same: 6
constant_names:
    upper: 22
true_false_null:
    lower: 19
    upper: 3
method_names:
    camel: 21
    lower_under: 1
method_brace_line:
    next: 15
    same: 7
control_brace_line:
    next: 4
    same: 18
control_space_after:
    no: 2
    yes: 20
always_use_control_braces:
    no: 3
    yes: 19
else_elseif_line:
    next: 6
    same: 16
case_break_indent_from_switch:
    0/1: 4
    1/1: 4
    1/2: 14
function_space_after:
    no: 22
closing_php_tag_required:
    no: 19
    yes: 3
line_endings:
    ?: 5
    LF: 17
static_or_visibility_first:
    ?: 5
    either: 7
    static: 4
    visibility: 6
control_space_parens:
    ?: 1
    no: 19
    yes: 2
blank_line_after_php:
    ?: 1
    no: 13
    yes: 8
class_method_control_brace:
    next/next/next: 4
    next/next/same: 11
    next/same/same: 1
    same/same/same: 6

Extends和Implements

Theextendsandimplementskeywords MUST be declared on the same line as
the class name.

<?phpnamespace VendorPackage;use FooClass;use BarClass as Bar;use OtherVendorOtherPackageBazClass;class ClassName extends ParentClass implements ArrayAccess, Countable{    // constants, properties, methods}

变量

Visibility(public、private、protected) MUST be declared on all
properties.

Thevarkeyword MUST NOT be used to declare a property.

There MUST NOT be more than one property declared per statement.

Property names SHOULD NOT be prefixed with
a single underscore to indicate protected or private
visibility.这里是SHOULD NOT,我个人觉得应该是MUST NOT。

A property declaration looks like the following.

<?phpnamespace VendorPackage;class ClassName{    public $foo = null;}

方法

Visibility MUST be declared on all methods.

Method names SHOULD NOT be prefixed with a single underscore to indicate
protected or private visibility.这里是SHOULD NOT,我个人觉得应该是MUST
NOT。

The opening brace MUST go on its own line, and the closing brace MUST go
on the next line following the body.

<?phpnamespace VendorPackage;class ClassName{    public function fooBarBaz($arg1, &$arg2, $arg3 = [])    {        // method body    }}

方法参数

In the argument list, there MUST NOT be a space before each comma, and
there MUST be one space after each comma.

Method arguments with default values MUST go at the end of the argument
list.

<?phpnamespace VendorPackage;class ClassName{    public function foo($arg1, &$arg2, $arg3 = [])    {        // method body    }}

When the argument list is split across multiple lines, the closing
parenthesis and opening brace MUST be placed together on their own line
with one space between them.

<?phpnamespace VendorPackage;class ClassName{    public function aVeryLongMethodName(        ClassTypeHint $arg1,        &$arg2,        array $arg3 = []    ) {        // method body    }}

abstract, final, and static

When present, theabstractandfinaldeclarations MUST precede the
visibility declaration.

When present, thestaticdeclaration MUST come after the visibility
declaration.

<?phpnamespace VendorPackage;abstract class ClassName{    protected static $foo;    abstract protected function zim();    final public static function bar()    {        // method body    }}

方法调用

When making a method or function call,

there MUST NOT be a space between the method or function name and the
opening parenthesis,

there MUST NOT be a space after the opening parenthesis, and there MUST
NOT be a space before the closing parenthesis.

In the argument list, there MUST NOT be a space before each comma, and
there MUST be one space after each comma.

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

控制结构

  • There MUST be one space after the control structure keyword
  • There MUST NOT be a space after the opening parenthesis
  • There MUST NOT be a space before the closing parenthesis
  • There MUST be one space between the closing parenthesis and the
    opening brace
  • The structure body MUST be indented once
  • The closing brace MUST be on the next line after the body

if, elseif, else

Anifstructure looks like the following. Note the placement of
parentheses, spaces, and braces; and thatelseandelseifare on the
same line as the closing brace from the earlier body.

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

switch, case

Aswitchstructure looks like the following.There MUST be a comment such
as// no breakwhen fall-through is intentional in a
non-emptycasebody.

<?phpswitch ($expr) {    case 0:        echo 'First case, with a 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;}

while, do while

<?phpwhile ($expr) {    // structure body}

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

for, foreach

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

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

try, catch

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

匿名函数

Closures MUST be declared with a space after thefunctionkeyword, and a
space before and after theusekeyword.

The opening brace MUST go on the same
line, and the closing brace MUST go on the next line following
the body.

There MUST NOT be a space after the opening parenthesis of the argument
list or variable list, and there MUST NOT be a space before the closing
parenthesis of the argument list or variable list.

In the argument list and variable list, there MUST NOT be a space before
each comma, and there MUST be one space after each comma.

Closure arguments with default values MUST go at the end of the argument
list.

A closure declaration looks like the following. Note the placement of
parentheses, commas, spaces, and braces:

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

那些个参数换行的写法这里就不介绍了,感觉那样子会让代码乱糟糟的,个人不建议那么做,方法的参数一定要写注释,注释相当重要,宁愿舍弃点规范,也要多写注释,规范少写一点,大不了可读性差点,如果注释少些点,那就根本读不了了。

好了,今天关于PSR-1和PSR-2对于代码的规范就说到这,接下来我会给大家带来PSR-3日志规范和PSR-4自动加载器相关内容。良好的开端是成功的基本要素,希望大家能好好遵守代码规范,毕竟代码如人,工工整整嘛。^_^

发表评论

电子邮件地址不会被公开。 必填项已用*标注