PHP團隊 編碼規範 & 代碼樣式風格規範

1、基本約定

一、源文件

(1)、純PHP代碼源文件只使用 <?php 標籤,省略關閉標籤 ?> ;php

(2)、源文件中PHP代碼的編碼格式必須是無BOM的UTF-8格式;html

(3)、使用 Unix LF(換行符)做爲行結束符;程序員

(4)、一個源文件只作一種類型的聲明,即,這個文件專門用來聲明Class, 那個文件專門用來設置配置信息,別混在一塊兒寫;sql

二、縮進

使用Tab鍵來縮進,每一個Tab鍵長度設置爲4個空格;數據庫

三、行

一行推薦的是最多寫120個字符,多於這個字符就應該換行了,通常的編輯器是能夠設置的。數組

四、關鍵字 和 True/False/Null

PHP的關鍵字,必須小寫,boolean值:true,false,null 也必須小寫。swoole

下面是PHP的「關鍵字」,必須小寫:app

'__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'框架

五、命名

(1)、類名 使用大駝峯式(StudlyCaps)寫法;編輯器

(2)、(類的)方法名 使用小駝峯(cameCase)寫法;

(3)、函數名使用 小寫字母 + 下劃線 寫法,如 function http_send_post(); 

(4)、變量名 使用小駝峯寫法,如 $userName;

六、代碼註釋標籤

如 函數註釋、變量註釋等,經常使用標籤有 @package@var@param@return@author@todo@throws

必須遵照 phpDocument 標籤規則,不要另外去創造新的標籤,更多標籤查看 phpDocument官網

七、業務模塊

(1)、涉及到多個數據表 更新/添加 操做時,最外層要用事務,保證數據庫操做的原子性;

(2)、Model層,只作簡單的數據表的查詢;

(3)、業務邏輯統一封裝到 Logic層;

(4)、控制器只作URL路由,不要看成 業務方法 調用;

(5)、控制器層不能出現SQL操做語句,如 ThinkPHP框架的 where()、order() 等模型方法,

即,控制器中,不要出現相似這樣的SQL語句:D('XXX')->where()->order()->limit()->find();  

where()、order()、limit() 等SQL方法只能出如今 Model層、業務層!

2、代碼樣式風格

一、命名空間(Namespace) 和 導入(Use)聲明

先簡單文字描述下:

  1. 命名空間(namespace)的聲明後面必須有一行空行;
  2. 全部的導入(use)聲明必須放在命名空間(namespace)聲明的下面;
  3. 一句聲明中,必須只有一個導入(use)關鍵字;
  4. 在導入(use)聲明代碼塊後面必須有一行空行;

用代碼來講明下:

<?php
namespace Lib\Databases; // 下面必須空格一行

class Mysql {

}

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

<?php
namespace Lib\Databases; // 下面必須空格一行

use FooInterface; // use 必須在namespace 後面聲明
use BarClass as Bar;
use OtherVendor\OtherPackage\BazClass; // 下面必須空格一行

class Mysql {

}

二、類(class),屬性(property)和方法(method)

(1)、繼承(extends) 和實現(implement) 必須和 class name 寫在一行。

<?php
namespace Lib\Databaes;

class Mysql extends ParentClass implements \PDO, \DB { // 寫一行

}

(2)、屬性(property)必須聲明其可見性,究竟是 public 仍是 protected 仍是 private,不能省略,也不能使用var, var是php老版本中的什麼方式,等用於public。

<?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,不能省略。若是有多個參數,第一個參數後緊接「,」 ,再加一個空格:function_name ($par, $par2, $pa3), 若是參數有默認值,「=」左右各有一個空格分開。

<?php
namespace Lib\Databaes;

class Mysql extends ParentClass implements \PDO, \DB { // 寫一行
    public getInfo($name, $age, $gender = 1) { // 參數之間有一個空格。默認參數的「=」左右各有一個空格,) 與 { 之間有一個空格

    }
}

(4)、當用到抽象(abstract)和終結(final)來作類聲明時,它們必須放在可見性聲明 (public 仍是protected仍是private)的前面。而當用到靜態(static)來作類聲明時,則必須放在可見性聲明的後面。

直接上代碼:

<?php
namespace Vendor\Package;

abstract class ClassName {
    protected static $foo; // static放後面
    abstract protected function zim(); // abstract放前面

    final public static function bar() { // final放前面,static放最後。
        // 方法主體部分
    }
}

三、控制結構

控制接口,就是 if else while switch等。這一類的寫法規範也是常常容易出現問題的,也要規範一下。

(1)、if,elseif,else寫法,直接上規範代碼吧:

<?php
if ($expr1) { // if 與 ( 之間有一個空格,) 與 { 之間有一個空格

} elseif ($expr2) { // elesif 連着寫,與 ( 之間有一個空格,) 與 { 之間有一個空格

} else { // else 左右各一個空格

}

(2)、switch,case 注意空格和換行,仍是直接上規範代碼:

<?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 的寫法也是相似,上代碼:

<?php
while ($expr) { // while 與 ( 之間有一個空格, ) 與 { 之間有一個空格

}

do { // do 與 { 之間有一個空格

} while ($expr); // while 左右各有一個空格

(4)、for的寫法

<?php
for ($i = 0; $i < 10; $i++) { // for 與 ( 之間有一個空格,二元操做符 "="、"<" 左右各有一個空格,) 與 { 之間有一個空格

}

(5)、foreach的寫法

<?php
foreach ($iterable as $key => $value) { // foreach 與 ( 之間有一個空格,"=>" 左右各有一個空格,) 與 { 之間有一個空格

}

(6)、try catch的寫法

<?php
try { // try 右邊有一個空格

} catch (FirstExceptionType $e) { // catch 與 ( 之間有一個空格,) 與 { 之間有一個空格

} catch (OtherExceptionType $e) { // catch 與 ( 之間有一個空格,) 與 { 之間有一個空格

}

四、註釋

(1)、行註釋

// 後面須要加一個空格;

若是 // 前面有非空字符,則 // 前面須要加一個空格;

(2)、函數註釋

參數名、屬性名、標籤的文本 上下要對齊;

在第一個標籤前加一個空行;

<?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") {

}

五、空格

(1)、賦值操做符(=,+= 等)、邏輯操做符(&&,||)、等號操做符(==,!=)、關係運算符(<,>,<=,>=)、按位操做符(&,|,^)、鏈接符(.) 左右各有一個空格;

(2)、if,else,elseif,while,do,switch,for,foreach,try,catch,finally 等 與 緊挨的左括號「(」之間有一個空格;

(3)、函數、方法的各個參數之間,逗號(",")後面有一個空格;

六、空行

(1)、全部左花括號 { 都不換行,而且 { 緊挨着的下方,必定不是空行;

(2)、同級代碼(縮進相同)的 註釋(行註釋/塊註釋)前面,必須有一個空行;

(3)、各個方法/函數 之間有一個空行;

(4)、namespace語句、use語句、clase語句 之間有一個空行;

(5)、return語句

若是 return 語句以前只有一行PHP代碼,return 語句以前不須要空行;

若是 return 語句以前有至少二行PHP代碼,return 語句以前加一個空行;

(5)、if,while,switch,for,foreach、try 等代碼塊之間 以及 與其餘代碼之間有一個空行;

 


 

參考示例 彙總

參考1:

<?php
namespace Lib\Databaes;

class Mysql extends ParentClass implements \PDO, \DB { // 寫一行
    public getInfo($name, $age, $gender = 1) { // 參數之間有一個空格。默認參數的「=」左右各有一個空格,) 與 { 之間有一個空格

    }
}

參考2:

<?php
namespace Vendor\Package;

abstract class ClassName {
    protected static $foo; // static放後面
    abstract protected function zim(); // abstract放前面

    final public static function bar() { // final放前面,static放最後。
        // 方法主體部分
    }
}

參考3:

<?php
namespace library\Model;

use library\Helper\ImageHelper;
use library\Logic\UserMainLogic;

/**
 * 用戶表 數據模型
 *
 * @package library\Model
 */
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:

$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_id\n";
});

// 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();

 

 

總結:全部左花括號 { 都不換行,而且 { 緊挨着的下方,必定不是空行!

 

上面的 代碼樣式規範,參考了 Java、JavaScript、Objective-C、Go 等開發語言的規範!

Java語言對中國程序員影響太深,大部分人仍是習慣把 左花括號 不換行!

書寫原則:作到 代碼緊湊 而又不失 小模塊化

  

PSR-4 規範

PSR-4規範是剛出沒多久的一條新的規範,它也是規範 自動加載(autoload)的,是對PSR-0的修改,屬於補充規範,

我簡單說下,主要是如下幾點: 

  1. 廢除了PSR-0中_就是目錄分割符的寫法,_下劃線在徹底限定類名中是沒有特殊含義了。 
  2. 類文件名要以 .php 結尾。 
  3. 類名必需要和對應的文件名要如出一轍,大小寫也要如出一轍

 

 

參考:

代碼風格研究:左花括號 是否換行???

PHP中PSR-[0-4]代碼規範

【薦】JavaScript編碼風格

 


 

【補充】數組 的書寫格式

只有一個鍵值對時,就寫成一行:

$where = array('id' => 789);

有多個(二個或二個以上)鍵值對時,就換行:

$where = array(
    'id' => 789,
    'user_name' => '52php'
);
相關文章
相關標籤/搜索