PHP 代碼規(guī)范

FIG 制定的 PHP 規(guī)范,簡稱 PSR,是 PHP 開發(fā)的事實標準闷袒。FIGFramework Interoperability Group (框架可互用小組) 的縮寫,由幾位開源框架的開發(fā)者成立于 2009 年律胀。該組織的目的在于:以最低程度的限制贝乎,來統(tǒng)一各個項目的編碼規(guī)范情连,避免各家自行發(fā)展的風格阻礙了程序設計師開發(fā)的困擾。PSRProposing a Standards Recommendation (提出標準建議) 的縮寫览效。

PSR 原來有五個規(guī)范却舀,分別是:

  • PSR-0 (Autoloading Standard) 自動加載標準。
  • PSR-1 (Basic Coding Standard) 基礎編碼標準朽肥。
  • PSR-2 (Coding Style Guide) 編碼風格向導禁筏。
  • PSR-3 (Logger Interface) 日志接口。
  • PSR-4 (Improved Autoloading) 自動加載的增強版衡招,可以替換掉 PSR-0 了篱昔。

今天我們的代碼規(guī)范是基于以上規(guī)范進行了整理。

1始腾、PHP 源文件只能使用 <?php<?= 這兩種標簽

<?php 標簽通常用于純 PHP 的腳本當中州刽,而 <?= 通常用于模板當中。

2浪箭、PHP 源文件必須是不帶 BOMUTF-8 編碼的文件

BOM(Byte Order Mark)穗椅,字節(jié)順序標記,出現(xiàn)在文本文件頭部奶栖,Unicode 編碼標準中用于標識文件是采用哪種格式的編碼匹表。

3、PHP 源文件縮進采用 4 個空格

很多編輯器使用 Tab 作為縮進宣鄙。會造成空格性問題袍镀。

4、純 PHP 代碼的源文件關閉標簽 ?> 必須省略

PHP 解析器在對文件進行解釋的時候冻晤,會有性能提升苇羡。并且,這能一定程序避免在 ?> 之后有多余的空格導致程序報錯鼻弧。

5设江、請嚴格控制每行 120 個字符

過長的代碼會導致多種分辨率的顯示器造成兼容問題。并且攘轩,過長的代碼也會造成難以閱讀理解叉存。如果實在太長,請把代碼換行度帮。

6鹉胖、所有的類必須設定一個命令空間

命令空間給代碼結構有較強的說明性,以及杜絕同名類的沖突問題。同時甫菠,也能用到 Composer 的自動加載優(yōu)勢特性。

<?php
namespace core;

?

7冕屯、命名空間(namespace)的聲明后面必須有一行空行

空行會讓代碼看起來更加清晰容易閱讀寂诱。

<?php
namespace core;

use common;

8、所有的導入(use)聲明必須放在命名空間(namespace)聲明的下面

這樣會讓代碼結構變得清晰容易閱讀安聘。

<?php
namespace core;

use common;

9痰洒、一句聲明中,必須只有一個導入(use)關鍵字

雖然 PHP 允許一行代碼當中允許使用多個 use 關鍵字導入一個類浴韭。但是丘喻,這會使代碼閱讀造成障礙。

錯誤:

<?php
namespace core;

use common, library;

正確:

<?php
namespace core;

use common;
use library;

10念颈、在導入(use)聲明代碼塊后面必須有一行空行

空行讓代碼結構變得容易理解泉粉。

<?php
namespace core;

use common;
use library;

class Person {
    
}

11、PHP 關鍵字必須小寫

PHP 的關鍵字榴芳,必須小寫嗡靡,boolean 值:true,false窟感,null 也必須小寫讨彼。下面的關鍵字,也必須小寫:

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

12柿祈、繼承(extends) 和實現(xiàn)(implement) 必須和 class name 寫在一行哈误,切花括號要換行寫。

<?php
namespace Lib\Databaes;
 
class Mysql extends ParentClass implements \PDO, \DB // 寫一行
{ // 換行寫{
     
}

13躏嚎、成員屬性訪問修飾符必須顯示聲明不能省略

成員屬性有三種訪問修飾符:public蜜自、protectedprivate紧索。不能使用老式的 var 來聲音成員屬性袁辈。

<?php
namespace Lib\Databaes;
 
class Mysql extends ParentClass implements \PDO, \DB // 寫一行
{
    public    $foo  = null;
    private   $name = 'sam';
    protected $age  = '17';
}

14、成員方法訪問修飾符必須顯示聲明不能省略

成員方法有三種訪問修飾符:public珠漂、protected晚缩、private

錯誤:

<?php
namespace Lib\Databases;

class MySQL
{
    function fetchOne()
    {
        // ......
    }
}

正確:

<?php
namespace Lib\Databases;

class MySQL
{
    public function fetchOne()
    {
        // ......
    }
}

15媳危、方法的參數(shù)有多個的時候荞彼,每個參數(shù)的逗號后面必須加個空格

namespace Lib\Databaes;
 
class Mysql extends ParentClass implements \PDO, \DB // 寫一行
{
    public getInfo ($name, $age, $gender = 1)
    {
    }
}

16、當用到抽象(abstract)和終結(final)來做類聲明時待笑,它們必須放在可見性聲明(public 還是protected還是private)的前面鸣皂。而當用到靜態(tài)(static)來做類聲明時,則必須放在可見性聲明的后面。

<?php
namespace Vendor\Package;
 
abstract class ClassName
{
    protected static $foo; // static 放后面
 
    abstract protected function zim(); // abstract 放前面
 
    final public static function bar() // final 放前面寞缝,static 放最后癌压。
    {
        // 方法主體部分
    }
}

17、控制結構花括號荆陆、換行滩届、空格等規(guī)范

if、else被啼、elseif帜消、switch、for浓体、foreach泡挺、case、while命浴、go娄猫、try、catch 等關鍵詞后面必須加空格咳促≈尚拢可以說,沒有特殊說明的情況下跪腹,基本上所有的 PHP 關鍵詞后面都必須加空格褂删。

流程控制語句起始的花括號是不需要另起一行。

if ($expr1) { // 左右空格
    // if body
} elseif ($expr2) { // elesif 連著寫
    // elseif body
} else {
    // else body;
}

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;
}

while ($expr) { // 左右空格
    // structure body
}
 
do {
    // structure body; // 左右空格
} while ($expr);

for ($i = 0; $i < 10; $i++) { // 注意幾個參數(shù)之間的空格
    // for body
}

foreach ($iterable as $key => $value) { // 還是空格問題
    // foreach body
}

try {
    // try body
} catch (FirstExceptionType $e) { // 同樣也是注意空格。
    // catch body
} catch (OtherExceptionType $e) {
    // catch body
}

18轴术、類名必須與文件名一樣

這個很容易理解难衰,沒啥好補充說明的。除非框架有特殊的加載規(guī)則逗栽。

19盖袭、類的命名必須遵循 StudlyCaps 大寫開頭的駝峰命名規(guī)范

StudlyCaps 即單詞首字母大寫風格。有些人也稱它為大駝峰彼宠。

20鳄虱、方法名稱必須符合 camelCase 式的小寫開頭駝峰命名規(guī)范

camelCase 即第一個單詞首字母小寫后面的單詞首字母大寫的風格。

21凭峡、類中的常量所有字母都必須大寫拙已,單詞間用下劃線分隔

CONST ORDER_STATUS = 1;

22、變量必須使用小駝峰命名風格

$cardNo   = ''; // 卡號摧冀。 
$idCardNo = ''; // 身份證號倍踪。

23系宫、參數(shù)必須使用駝峰命名風格

參數(shù)也是變量的一種。故與變量的命名風格一致建车。

24扩借、所有方法的起始花括號必須另起一行。

雖然以下兩種在實際開發(fā)中都是允許的癞志。但是往枷,為了保持代碼一致。所以凄杯,必須強制使用。

錯誤:

<?php

class MySQL
{
    public function fetchOne() {
        
    }
}

正確:

<?php

class MySQL
{
    public function fetchOne() 
    {
        
    }
}

25秉宿、直接在方法中寫數(shù)組參數(shù)時格式如下

$object->callFunc([
    'userId'   => 1,
    'username' => 'sam',
    'age'      => 20,
    'sex'      => 'male'
]);

26戒突、方法參數(shù)注釋

/**
 * 管理后臺獲取優(yōu)惠券發(fā)送記錄。
 *
 * @author 7031 2018-02-23
 * @modify 7031 2019-02-25 修復了 SQL 性能問題描睦。
 *
 * @param int    $couponId      優(yōu)惠券ID膊存。
 * @param string $username      用戶名。
 * @param string $mobilephone   用戶手機號忱叭。
 * @param int    $page          當前分頁頁碼隔崎。
 * @param int    $count         每頁顯示條數(shù)。
 * @param array  $data          請求參數(shù)韵丑。
 *
 * ------------------- eg:start ---------------------
 * $data = [
 *     'username' => '用戶賬號,沒有時傳空字符串',
 *     'age'      => '用戶年齡,沒有時傳0',
 * ];
 * ------------------- eg:end -----------------------
 *
 * @return array
 */
public static function getBackendSendHistory($couponId = -1, $username, $mobilephone, $page, $count, $data) {

}

可以看出爵卒,有以下幾個注釋特點:

1)方法說明。

2)創(chuàng)建方法的同事編號以及時間撵彻。

3)修改方法的同事編號以及時間與修改的內(nèi)容钓株。

4)參數(shù)注釋:類型、名稱陌僵、參數(shù)說明轴合。參數(shù)與其他注釋之間要有空行。

5)參數(shù)示例:如果參數(shù)當中有復雜的參數(shù)碗短∈芨穑可以在參數(shù)下方給出示例以增強說明。

6)返回值偎谁。需要給出返回的類型总滩。

27、方法的代碼行數(shù)不能超過一屏

每個人的顯示器分辨率不一樣搭盾。既然不超過一屏也會出現(xiàn)別的同事一屏會超出的情況咳秉。所以,即使未超過一屏鸯隅,也盡量保證代碼行在 40 行以內(nèi)澜建。如果發(fā)現(xiàn)自己的代碼超過了 40 行向挖,那么就需要考慮自己的代碼是不是有拆分不合理的地方。特殊情況允許超過 40 行炕舵。但是何之,整個方法里面的代碼必須是簡單的判斷邏輯。不包含復雜的業(yè)務判斷邏輯咽筋。因為溶推,不同的業(yè)務判斷最佳實踐是單獨封裝一個方法。

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末奸攻,一起剝皮案震驚了整個濱河市蒜危,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌睹耐,老刑警劉巖辐赞,帶你破解...
    沈念sama閱讀 222,627評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異硝训,居然都是意外死亡响委,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,180評論 3 399
  • 文/潘曉璐 我一進店門窖梁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來赘风,“玉大人,你說我怎么就攤上這事纵刘⊙裕” “怎么了?”我有些...
    開封第一講書人閱讀 169,346評論 0 362
  • 文/不壞的土叔 我叫張陵彰导,是天一觀的道長蛔翅。 經(jīng)常有香客問我,道長位谋,這世上最難降的妖魔是什么山析? 我笑而不...
    開封第一講書人閱讀 60,097評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮掏父,結果婚禮上笋轨,老公的妹妹穿的比我還像新娘。我一直安慰自己赊淑,他們只是感情好爵政,可當我...
    茶點故事閱讀 69,100評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著陶缺,像睡著了一般钾挟。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上饱岸,一...
    開封第一講書人閱讀 52,696評論 1 312
  • 那天掺出,我揣著相機與錄音徽千,去河邊找鬼。 笑死汤锨,一個胖子當著我的面吹牛双抽,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播闲礼,決...
    沈念sama閱讀 41,165評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼牍汹,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了柬泽?” 一聲冷哼從身側響起慎菲,我...
    開封第一講書人閱讀 40,108評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎锨并,沒想到半個月后钧嘶,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,646評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡琳疏,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,709評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了闸拿。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片空盼。...
    茶點故事閱讀 40,861評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖新荤,靈堂內(nèi)的尸體忽然破棺而出揽趾,到底是詐尸還是另有隱情,我是刑警寧澤苛骨,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布篱瞎,位于F島的核電站,受9級特大地震影響痒芝,放射性物質發(fā)生泄漏俐筋。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,196評論 3 336
  • 文/蒙蒙 一严衬、第九天 我趴在偏房一處隱蔽的房頂上張望澄者。 院中可真熱鬧,春花似錦请琳、人聲如沸粱挡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,698評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽询筏。三九已至,卻和暖如春竖慧,著一層夾襖步出監(jiān)牢的瞬間嫌套,已是汗流浹背逆屡。 一陣腳步聲響...
    開封第一講書人閱讀 33,804評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留灌危,地道東北人康二。 一個月前我還...
    沈念sama閱讀 49,287評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像勇蝙,于是被迫代替她去往敵國和親沫勿。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,860評論 2 361

推薦閱讀更多精彩內(nèi)容