2018年11月6日 星期二

《面試官別再問》PHP Coding Style指南PSR-2

這個指南是在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標準建議,採納共享的解決方案.

在此介紹一項工具

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 塊之後必須有一個空行

<?php
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關鍵字必須被聲明在作為類名的同一行

類的開花括號必須獨佔一行; 類的閉花括號必須在類體之後獨佔一行

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

沒有留言:

張貼留言

熱門文章