這個指南是在PSR-1上的延伸和擴展,基本的編碼標準
本指南的目的是減少認知摩擦(風格不統一而造成不便),當瀏覽不同作者的代碼時。它做的這些關於如何格式化PHP代碼通過列舉一個共享的規則設置和期望
此處樣式規則衍生均來自各成員項目間的共性。當不同作者在多個項目間合作時,有一個設置的指南,它有助於被用來在所有這些項目中使用。因此,本指南的好處不在規則本身,而是這個規則的共享
PSR是PHP Standards Recommendations(PHP標準建議) 的簡寫,是由PHP-FIG組織(PHP Framework Interop Group-PHP框架交互操作組織)提出。 PHP-FIG的工作是尋找項目之間的共性,以及讓開發者能更好協同工作的方式。讀者可能在瀏覽一些PHP技術文章的時候,可能會看到PSR-1,PSR-2,PSR-4,PSR-7等,這些是PHP-FIG的標準建議,這些標準建議的命名構成是以' PSR-'+'序號',每個PHP_FIG標準建議都是為了解決大部分框架頻繁遇到的一個特定的問題,而與此同時框架不需要自己再去重複解決問題,而是遵循PSR標準建議,採納共享的解決方案.
安裝
composer require squizlabs/php_codesniffer
測試
phpcs --version
檢查程式
phpcs --standard=PSR2 專案資料夾
PHP文件(MUST)必須只能使用無BOM頭的UTF-8編碼格式.
PHP文件(SHOULD)應該要么聲明classe,functions。 constants 等等,或者general ouput(通用輸出?),改變php.ini的配置等等,但是(SHOULD Not)不應該兩個都有.
命名空間和類(MUST)必須要遵循自動加載的PSR規範[PSR-0,PSR-4];
類名明明(MUST)必須以大駝峰式.
類中的常量的命名(MUST)必須為以下劃線分割的大寫字母.
方法名(MUST)必須為小駝峰式.
PHP代碼(MUST)必須只使用無BOM頭的UTF-8編碼格式.
'side effects'代表的就是和聲明class,function,constant等不直接相關聯的執行邏輯,僅僅來自這個包含的文件。
'Side effects' 包含以下操作,但不僅限於此:general output(通用輸出), 'require'和'include'的使用,連接外部服務,修改php.ini的設置,觸發錯誤或者拋出異常,修改全局或者靜態變量,讀取或者寫入文件操作等等.
以下是一個我們要避免的例子,就是一個具有'declarations'和side effects的PHP文件。
<?php
// side effect: change ini settings
ini_set('error_reporting', E_ALL);
// side effect: loads a file
include "file.php";
// side effect: generates output
echo "<html>\n";
// declaration
function foo()
{
// function body
}
以下是一個是正確的例子,只包含了'declaraion'沒有'side effects'.
<?php
// declaration
function foo()
{
// function body
}
代碼必須遵循PSR-1中的所有規範
文件
所有PHP文件必須使用Unix LF(linefeed)作為行的結束符
所有PHP文件必須以一個空白行作為結束
只包含PHP代碼的文件結束?>標記必須被忽略
行
行的長度一定不能有硬性約束
行長度的軟限制必須在120字符內;自動樣式檢查必須警告但一定不能提示錯誤在軟限制上
行不應該超過80個字符;超過80個字符的長度的行應當拆分成多個不超過80個字符的子行
非空行後一定不能尾隨空格符
空行可以改善代碼閱讀,並且表明相關的代碼塊
每行一定不能存在多於一條語句
縮進
編碼必須使用4個空格,並且一定不能使用tab縮進
僅使用空格,並且不要混淆空格用tab,有助於避免比較差異,打補丁,重讀和註解問題。使用空格也使插入細粒度的子縮進為了跨線對齊變得容易
關鍵字:True,False,Null
PHP 關鍵字必須小寫
PHP常量true,false,null必須小寫
Namespace and Use Declarations - 命名空間和使用聲明
在目前,namespace聲明之後必須有一個空行
在目前,所有use聲明必須在namespace聲明之後
每個聲明必須有一個use關鍵字
namespace Vendor \ Package ;
use FooClass ;
use BarClass as Bar ;
use OtherVendor \ OtherPackage \ BazClass ;
// ... additional PHP code ...
Classes,Properties,and Methods - 類,屬性和方法
術語class指的是所有的class,interface,trait
繼承和實現
extends和implements關鍵字必須被聲明在作為類名的同一行
類的開花括號必須獨佔一行; 類的閉花括號必須在類體之後獨佔一行
控制結構的關鍵字之後應該有一個空格
左括號之後不應該有空格
右括號之前不應該有空格
右花括號和左花括號之間應該有一個空格
結構體應該縮印一次
右花括號應該在結構體的下一行
每一個結構體應該被花括號包圍;這樣子,結構看起來很標準,並且當加入新行的時候,gi 可以減少引入錯誤的可能性。
if, elseif, else
一個if結構看起來像下面那樣。注意圓括號的位置,空格和花括號;並且else和elseif與來自之前的結構體閉花括號在相同的行
<?php
if ($expr1) { // if body } elseif ($expr2) { // elseif body } else { // else body; }
關鍵字elseif應該被使用而不是else if以至於所有的控制關鍵字看起來像單個單詞
switch, case
一個switch結構看起來像下面那樣。注意圓括號的位置,空格和花括號。 case語句必須被縮進一次在switch中,並且break關鍵字(或者其它終止關鍵字)必須被縮進相同的級別在case體內。當故意落空一個非空case體時必須有一個註釋,例如:// 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 ; }
本指南的目的是減少認知摩擦(風格不統一而造成不便),當瀏覽不同作者的代碼時。它做的這些關於如何格式化PHP代碼通過列舉一個共享的規則設置和期望
此處樣式規則衍生均來自各成員項目間的共性。當不同作者在多個項目間合作時,有一個設置的指南,它有助於被用來在所有這些項目中使用。因此,本指南的好處不在規則本身,而是這個規則的共享
PSR是PHP Standards Recommendations(PHP標準建議) 的簡寫,是由PHP-FIG組織(PHP Framework Interop Group-PHP框架交互操作組織)提出。 PHP-FIG的工作是尋找項目之間的共性,以及讓開發者能更好協同工作的方式。讀者可能在瀏覽一些PHP技術文章的時候,可能會看到PSR-1,PSR-2,PSR-4,PSR-7等,這些是PHP-FIG的標準建議,這些標準建議的命名構成是以' PSR-'+'序號',每個PHP_FIG標準建議都是為了解決大部分框架頻繁遇到的一個特定的問題,而與此同時框架不需要自己再去重複解決問題,而是遵循PSR標準建議,採納共享的解決方案.
在此介紹一項工具
PHP Code Sniffer 簡稱 phpcs,可以用來檢查你寫的PHP是否符合PSR-2我們可以用Composer 來安裝他安裝
composer require squizlabs/php_codesniffer
測試
phpcs --version
檢查程式
phpcs --standard=PSR2 專案資料夾
OverView (概覽)
PHP文件(MUST)必須只使用<?php 和<?= 標籤.PHP文件(MUST)必須只能使用無BOM頭的UTF-8編碼格式.
PHP文件(SHOULD)應該要么聲明classe,functions。 constants 等等,或者general ouput(通用輸出?),改變php.ini的配置等等,但是(SHOULD Not)不應該兩個都有.
命名空間和類(MUST)必須要遵循自動加載的PSR規範[PSR-0,PSR-4];
類名明明(MUST)必須以大駝峰式.
類中的常量的命名(MUST)必須為以下劃線分割的大寫字母.
方法名(MUST)必須為小駝峰式.
PHP代碼(MUST)必須只使用無BOM頭的UTF-8編碼格式.
Side Effects
一個PHP文件(SHOULD)必須要聲明一些class,function,constant等,並且沒有side effects (執行邏輯),或者(SHOULD)應該有side effects(執行邏輯),但是(SHOULD NOT)不應該兩個都同時存在.'side effects'代表的就是和聲明class,function,constant等不直接相關聯的執行邏輯,僅僅來自這個包含的文件。
'Side effects' 包含以下操作,但不僅限於此:general output(通用輸出), 'require'和'include'的使用,連接外部服務,修改php.ini的設置,觸發錯誤或者拋出異常,修改全局或者靜態變量,讀取或者寫入文件操作等等.
以下是一個我們要避免的例子,就是一個具有'declarations'和side effects的PHP文件。
<?php
// side effect: change ini settings
ini_set('error_reporting', E_ALL);
// side effect: loads a file
include "file.php";
// side effect: generates output
echo "<html>\n";
// declaration
function foo()
{
// function body
}
以下是一個是正確的例子,只包含了'declaraion'沒有'side effects'.
<?php
// declaration
function foo()
{
// function body
}
General - 約定
基本編碼標準代碼必須遵循PSR-1中的所有規範
文件
所有PHP文件必須使用Unix LF(linefeed)作為行的結束符
所有PHP文件必須以一個空白行作為結束
只包含PHP代碼的文件結束?>標記必須被忽略
行
行的長度一定不能有硬性約束
行長度的軟限制必須在120字符內;自動樣式檢查必須警告但一定不能提示錯誤在軟限制上
行不應該超過80個字符;超過80個字符的長度的行應當拆分成多個不超過80個字符的子行
非空行後一定不能尾隨空格符
空行可以改善代碼閱讀,並且表明相關的代碼塊
每行一定不能存在多於一條語句
縮進
編碼必須使用4個空格,並且一定不能使用tab縮進
僅使用空格,並且不要混淆空格用tab,有助於避免比較差異,打補丁,重讀和註解問題。使用空格也使插入細粒度的子縮進為了跨線對齊變得容易
關鍵字:True,False,Null
PHP 關鍵字必須小寫
PHP常量true,false,null必須小寫
Namespace and Use Declarations - 命名空間和使用聲明
在目前,namespace聲明之後必須有一個空行
在目前,所有use聲明必須在namespace聲明之後
每個聲明必須有一個use關鍵字
use 塊之後必須有一個空行
<?phpnamespace Vendor \ Package ;
use FooClass ;
use BarClass as Bar ;
use OtherVendor \ OtherPackage \ BazClass ;
// ... additional PHP code ...
Classes,Properties,and Methods - 類,屬性和方法
術語class指的是所有的class,interface,trait
繼承和實現
extends和implements關鍵字必須被聲明在作為類名的同一行
類的開花括號必須獨佔一行; 類的閉花括號必須在類體之後獨佔一行
implements的列表可以被分隔成多行,每個子行要縮進。當這樣做,列表中的第一個條目必須獨佔一行,並且必須是僅僅一個接口獨佔一行
<?php
namespace Vendor \ Package ;
use FooClass ;
use BarClass as Bar ;
use OtherVendor \ OtherPackage \ BazClass ;
class ClassName extends ParentClass implements
\ ArrayAccess ,
\ Countable ,
\ Serializable
{ // constants, properties, methods }
控制結構(Control Structures)
控制結構的通用編碼風格規範:控制結構的關鍵字之後應該有一個空格
左括號之後不應該有空格
右括號之前不應該有空格
右花括號和左花括號之間應該有一個空格
結構體應該縮印一次
右花括號應該在結構體的下一行
每一個結構體應該被花括號包圍;這樣子,結構看起來很標準,並且當加入新行的時候,gi 可以減少引入錯誤的可能性。
if, elseif, else
一個if結構看起來像下面那樣。注意圓括號的位置,空格和花括號;並且else和elseif與來自之前的結構體閉花括號在相同的行
<?php
if ($expr1) { // if body } elseif ($expr2) { // elseif body } else { // else body; }
關鍵字elseif應該被使用而不是else if以至於所有的控制關鍵字看起來像單個單詞
switch, case
一個switch結構看起來像下面那樣。注意圓括號的位置,空格和花括號。 case語句必須被縮進一次在switch中,並且break關鍵字(或者其它終止關鍵字)必須被縮進相同的級別在case體內。當故意落空一個非空case體時必須有一個註釋,例如:// 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 ; }
留言
張貼留言