FIG 制定的
PHP
規範,簡稱PSR
,是PHP
開發的事實標準。FIG
是Framework Interoperability Group
(框架可互用小組) 的縮寫,由幾位開源框架的開發者成立於 2009 年。該組織的目的在於:以最低程度的限制,來統一各個項目的編碼規範,避免各家自行發展的風格阻礙了程序設計師開發的困擾。PSR
是Proposing a Standards Recommendation
(提出標準建議) 的縮寫。php
PSR 原來有五個規範,分別是:html
PSR-0 (Autoloading Standard)
自動加載標準。PSR-1 (Basic Coding Standard)
基礎編碼標準。PSR-2 (Coding Style Guide)
編碼風格嚮導。PSR-3 (Logger Interface)
日誌接口。PSR-4 (Improved Autoloading)
自動加載的加強版,能夠替換掉 PSR-0
了。今天咱們的代碼規範是基於以上規範進行了整理。sql
PHP
源文件只能使用 <?php
和 <?=
這兩種標籤
<?php
標籤一般用於純PHP
的腳本當中,而<?=
一般用於模板當中。數組
PHP
源文件必須是不帶 BOM
的 UTF-8
編碼的文件
BOM(Byte Order Mark)
,字節順序標記,出如今文本文件頭部,Unicode
編碼標準中用於標識文件是採用哪一種格式的編碼。框架
PHP
源文件縮進採用 4 個空格不少編輯器使用
Tab
做爲縮進。會形成空格性問題。編輯器
PHP
代碼的源文件關閉標籤 ?>
必須省略
PHP
解析器在對文件進行解釋的時候,會有性能提高。而且,這能必定程序避免在?>
以後有多餘的空格致使程序報錯。ide
過長的代碼會致使多種分辨率的顯示器形成兼容問題。而且,過長的代碼也會形成難以閱讀理解。若是實在太長,請把代碼換行。性能
命令空間給代碼結構有較強的說明性,以及杜絕同名類的衝突問題。同時,也能用到 Composer 的自動加載優點特性。fetch
<?php namespace core;
namespace
)的聲明後面必須有一行空行空行會讓代碼看起來更加清晰容易閱讀。ui
<?php namespace core; use common;
這樣會讓代碼結構變得清晰容易閱讀。
<?php namespace core; use common;
雖然 PHP 容許一行代碼當中容許使用多個 use 關鍵字導入一個類。可是,這會使代碼閱讀形成障礙。
錯誤:
<?php namespace core; use common, library;
正確:
<?php namespace core; use common; use library;
空行讓代碼結構變得容易理解。
<?php namespace core; use common; use library; class Person { }
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'
<?php namespace Lib\Databaes; class Mysql extends ParentClass implements \PDO, \DB // 寫一行 { // 換行寫{ }
成員屬性有三種訪問修飾符:
public
、protected
、private
。不能使用老式的var
來聲音成員屬性。
<?php namespace Lib\Databaes; class Mysql extends ParentClass implements \PDO, \DB // 寫一行 { public $foo = null; private $name = 'sam'; protected $age = '17'; }
成員方法有三種訪問修飾符:
public
、protected
、private
。
錯誤:
<?php namespace Lib\Databases; class MySQL { function fetchOne() { // ...... } }
正確:
<?php namespace Lib\Databases; class MySQL { public function fetchOne() { // ...... } }
namespace Lib\Databaes; class Mysql extends ParentClass implements \PDO, \DB // 寫一行 { public getInfo ($name, $age, $gender = 1) { } }
<?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、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++) { // 注意幾個參數之間的空格 // for body } foreach ($iterable as $key => $value) { // 仍是空格問題 // foreach body } try { // try body } catch (FirstExceptionType $e) { // 一樣也是注意空格。 // catch body } catch (OtherExceptionType $e) { // catch body }
這個很容易理解,沒啥好補充說明的。除非框架有特殊的加載規則。
StudlyCaps
大寫開頭的駝峯命名規範StudlyCaps 即單詞首字母大寫風格。有些人也稱它爲大駝峯。
camelCase
式的小寫開頭駝峯命名規範camelCase 即第一個單詞首字母小寫後面的單詞首字母大寫的風格。
CONST ORDER_STATUS = 1;
$cardNo = ''; // 卡號。 $idCardNo = ''; // 身份證號。
參數也是變量的一種。故與變量的命名風格一致。
雖然如下兩種在實際開發中都是容許的。可是,爲了保持代碼一致。因此,必須強制使用。
錯誤:
<?php class MySQL { public function fetchOne() { } }
正確:
<?php class MySQL { public function fetchOne() { } }
$object->callFunc([
'userId' => 1, 'username' => 'sam', 'age' => 20, 'sex' => 'male' ]);
/** * 管理後臺獲取優惠券發送記錄。 * * @author 7031 2018-02-23 * @modify 7031 2019-02-25 修復了 SQL 性能問題。 * * @param int $couponId 優惠券ID。 * @param string $username 用戶名。 * @param string $mobilephone 用戶手機號。 * @param int $page 當前分頁頁碼。 * @param int $count 每頁顯示條數。 * @param array $data 請求參數。 * * ------------------- eg:start --------------------- * $data = [ * 'username' => '用戶帳號,沒有時傳空字符串', * 'age' => '用戶年齡,沒有時傳0', * ]; * ------------------- eg:end ----------------------- * * @return array */ public static function getBackendSendHistory($couponId = -1, $username, $mobilephone, $page, $count, $data) { }
能夠看出,有如下幾個註釋特色:
1)方法說明。
2)建立方法的同事編號以及時間。
3)修改方法的同事編號以及時間與修改的內容。
4)參數註釋:類型、名稱、參數說明。參數與其餘註釋之間要有空行。
5)參數示例:若是參數當中有複雜的參數。能夠在參數下方給出示例以加強說明。
6)返回值。須要給出返回的類型。
每一個人的顯示器分辨率不同。既然不超過一屏也會出現別的同事一屏會超出的狀況。因此,即便未超過一屏,也儘可能保證代碼行在 40 行之內。若是發現本身的代碼超過了 40 行,那麼就須要考慮本身的代碼是否是有拆分不合理的地方。特殊狀況容許超過 40 行。可是,整個方法裏面的代碼必須是簡單的判斷邏輯。不包含複雜的業務判斷邏輯。由於,不一樣的業務判斷最佳實踐是單獨封裝一個方法。