php 結構體_【開發規范】PHP編碼開發規范下篇:PSR-2編碼風格規范

之前的一篇文章是對PSR-1的基本介紹

接下來是PSR-2 編碼風格規范,它是 PSR-1 基本代碼規范的繼承與擴展。

PSR-1 和PSR-2是PHP開發中基本的編碼規范,大家其實都可以參考學習下,雖然說每個開發者都有自己熟悉的一套開發規范,但是我覺得還是根據行業標準來編寫我們的代碼,畢竟標準都是經過驗證的了。希望能對PHP開發者有幫助吧。

402e63ded0f0b34de6387d374fd0d372.png

1. 概覽

  • 代碼 必須 遵循 [PSR-1]() 中的編碼規范 。
  • 代碼 必須 使用4個空格符而不是「Tab 鍵」進行縮進。
  • 每行的字符數 應該 軟性保持在 80 個之內,理論上 一定不可 多于 120 個,但 一定不可 有硬性限制。
  • 每個 namespace 命名空間聲明語句和 use 聲明語句塊后面,必須 插入一個空白行。
  • 類的開始花括號({) 必須 寫在類聲明后自成一行,結束花括號(})也 必須 寫在類主體后自成一行。
  • 方法的開始花括號({) 必須 寫在函數聲明后自成一行,結束花括號(})也 必須 寫在函數主體后自成一行。
  • 類的屬性和方法 必須 添加訪問修飾符(private、protected 以及 public),abstract 以及 final 必須 聲明在訪問修飾符之前,而 static 必須 聲明在訪問修飾符之后。
  • 控制結構的關鍵字后 必須 要有一個空格符,而調用方法或函數時則 一定不可 有。
  • 控制結構的開始花括號({) 必須 寫在聲明的同一行,而結束花括號(}) 必須 寫在主體后自成一行。
  • 控制結構的開始左括號后和結束右括號前,都 一定不可 有空格符。

1.1. 例子

以下例子程序簡單地展示了以上大部分規范:

<?phpnamespace VendorPackage;use FooInterface;use BarClass as Bar;use OtherVendorOtherPackageBazClass;class Foo extends Bar implements FooInterface{ public function sampleFunction($a, $b = null) { if ($a === $b) { bar(); } elseif ($a > $b) { $foo->bar($arg1); } else { BazClass::bar($arg2, $arg3); } } final public static function bar() { // 方法的內容 }}

2. 通則

2.1 基本編碼準則

代碼 必須 符合 [PSR-1]() 中的所有規范。

2.2 文件

所有PHP文件 必須 使用 Unix LF (linefeed) 作為行的結束符。

所有PHP文件 必須 以一個空白行作為結束。

純PHP代碼文件 必須 省略最后的 ?> 結束標簽。

2.3. 行

行的長度 一定不可 有硬性的約束。

軟性的長度約束 必須 要限制在 120 個字符以內,若超過此長度,帶代碼規范檢查的編輯器 必須 要發出警告,不過 一定不可 發出錯誤提示。

每行 不該 多于80個字符,大于80字符的行 應該 折成多行。

非空行后 一定不可 有多余的空格符。

空行 可以 使得閱讀代碼更加方便以及有助于代碼的分塊。

每行 一定不可 存在多于一條語句。

2.4. 縮進

代碼 必須 使用4個空格符的縮進,一定不可 用 tab鍵。

備注:使用空格而不是「tab鍵縮進」的好處在于,

避免在比較代碼差異、打補丁、重閱代碼以及注釋時產生混淆。

并且,使用空格縮進,讓對齊變得更方便。

2.5. 關鍵字 以及 True/False/Null

PHP所有 關鍵字 必須 全部小寫。

常量 true 、false 和 null 也 必須 全部小寫。

3. namespace 以及 use 聲明

namespace 聲明后 必須 插入一個空白行。

所有 use 必須 在 namespace 后聲明。

每條 use 聲明語句 必須 只有一個 use 關鍵詞。

use 聲明語句塊后 必須 要有一個空白行。

例如:

namespace VendorPackage;use FooClass;use BarClass as Bar;use OtherVendorOtherPackageBazClass;

4. 類、屬性和方法

此處的「類」泛指所有的「class類」、「接口」以及「traits 可復用代碼塊」。

4.1. 擴展與繼承

關鍵詞 extends 和 implements 必須 寫在類名稱的同一行。

類的開始花括號 必須 獨占一行,結束花括號也 必須 在類主體后獨占一行。

<?phpnamespace VendorPackage;use FooClass;use BarClass as Bar;use OtherVendorOtherPackageBazClass;class ClassName extends ParentClass implements ArrayAccess, Countable{ // 這里面是常量、屬性、類方法}

implements 的繼承列表也 可以 分成多行,這樣的話,每個繼承接口名稱都 必須 分開獨立成行,包括第一個。

namespace VendorPackage;use FooClass;use BarClass as Bar;use OtherVendorOtherPackageBazClass;class ClassName extends ParentClass implements ArrayAccess, Countable, Serializable{ // 這里面是常量、屬性、類方法}

4.2. 屬性

每個屬性都 必須 添加訪問修飾符。

一定不可 使用關鍵字 var 聲明一個屬性。

每條語句 一定不可 定義超過一個屬性。

不該 使用下劃線作為前綴,來區分屬性是 protected 或 private。

以下是屬性聲明的一個范例:

<?phpnamespace VendorPackage;class ClassName{ public $foo = null;}

4.3. 方法

所有方法都 必須 添加訪問修飾符。

不該 使用下劃線作為前綴,來區分方法是 protected 或 private。

方法名稱后 一定不可 有空格符,其開始花括號 必須 獨占一行,結束花括號也 必須 在方法主體后單獨成一行。參數左括號后和右括號前 一定不可 有空格。

一個標準的方法聲明可參照以下范例,留意其括號、逗號、空格以及花括號的位置。

<?phpnamespace VendorPackage;class ClassName{ public function fooBarBaz($arg1, &$arg2, $arg3 = []) { // method body }}

4.4. 方法的參數

參數列表中,每個逗號后面 必須 要有一個空格,而逗號前面 一定不可 有空格。

有默認值的參數,必須 放到參數列表的末尾。

<?phpnamespace VendorPackage;class ClassName{ public function foo($arg1, &$arg2, $arg3 = []) { // method body }}

參數列表 可以 分列成多行,這樣,包括第一個參數在內的每個參數都 必須 單獨成行。

拆分成多行的參數列表后,結束括號以及方法開始花括號 必須 寫在同一行,中間用一個空格分隔。

<?phpnamespace VendorPackage;class ClassName{ public function aVeryLongMethodName( ClassTypeHint $arg1, &$arg2, array $arg3 = [] ) { // 方法的內容 }}

4.5. abstract 、 final 、 以及 static

需要添加 abstract 或 final 聲明時,必須 寫在訪問修飾符前,而 static 則 必須 寫在其后。

<?phpnamespace VendorPackage;abstract class ClassName{ protected static $foo; abstract protected function zim(); final public static function bar() { // method body }}

4.6. 方法及函數調用

方法及函數調用時,方法名或函數名與參數左括號之間 一定不可 有空格,參數右括號前也 一定不可 有空格。每個參數前 一定不可 有空格,但其后 必須 有一個空格。

<?phpbar ();$foo->bar($arg1);Foo::bar($arg2, $arg3);參數 可以 分列成多行,此時包括第一個參數在內的每個參數都 必須 單獨成行。<?php $foo->bar( $longArgument, $longerArgument, $muchLongerArgument);

5. 控制結構

控制結構的基本規范如下:

  • 控制結構關鍵詞后 必須 有一個空格。
  • 左括號 ( 后 一定不可 有空格。
  • 右括號 ) 前也 一定不可 有空格。
  • 右括號 ) 與開始花括號 { 間 必須 有一個空格。
  • 結構體主體 必須 要有一次縮進。
  • 結束花括號 } 必須 在結構體主體后單獨成行。

每個結構體的主體都 必須 被包含在成對的花括號之中,

這能讓結構體更加結構話,以及減少加入新行時,出錯的可能性。

5.1. if 、elseif 和 else

標準的 if 結構如下代碼所示,請留意「括號」、「空格」以及「花括號」的位置,

注意 else 和 elseif 都與前面的結束花括號在同一行。

<?phpif ($expr1) { // if body} elseif ($expr2) { // elseif body} else { // else body;}

應該 使用關鍵詞 elseif 代替所有 else if ,以使得所有的控制關鍵字都像是單獨的一個詞。

5.2. switch 和 case

標準的 switch 結構如下代碼所示,留意括號、空格以及花括號的位置。

case 語句 必須 相對 switch 進行一次縮進,而 break 語句以及 case 內的其它語句都 必須 相對 case進行一次縮進。

如果存在非空的 case 直穿語句,主體里 必須 有類似 // no break 的注釋。

<?phpswitch ($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;}

5.3. while 和 do while

一個規范的 while 語句應該如下所示,注意其「括號」、「空格」以及「花括號」的位置。

<?phpwhile ($expr) { // structure body}

標準的 do while 語句如下所示,同樣的,注意其「括號」、「空格」以及「花括號」的位置。

<?phpdo { // structure body;} while ($expr);

5.4. for

標準的 for 語句如下所示,注意其「括號」、「空格」以及「花括號」的位置。

<?phpfor ($i = 0; $i < 10; $i++) { // for body}

5.5. foreach

標準的 foreach 語句如下所示,注意其「括號」、「空格」以及「花括號」的位置。

<?phpforeach ($iterable as $key => $value) { // foreach body}

5.6. try, catch

標準的 try catch 語句如下所示,注意其「括號」、「空格」以及「花括號」的位置。

<?phptry { // try body} catch (FirstExceptionType $e) { // catch body} catch (OtherExceptionType $e) { // catch body}

6. 閉包

閉包聲明時,關鍵詞 function 后以及關鍵詞 use 的前后都 必須 要有一個空格。

開始花括號 必須 寫在聲明的同一行,結束花括號 必須 緊跟主體結束的下一行。

參數列表和變量列表的左括號后以及右括號前,一定不可 有空格。

參數和變量列表中,逗號前 一定不可 有空格,而逗號后 必須 要有空格。

閉包中有默認值的參數 必須 放到列表的后面。

標準的閉包聲明語句如下所示,注意其「括號」、「空格」以及「花括號」的位置。

<?php $closureWithArgs = function ($arg1, $arg2) { // body};$closureWithArgsAndVars = function ($arg1, $arg2) use ($var1, $var2) { // body};

參數列表以及變量列表 可以 分成多行,這樣,包括第一個在內的每個參數或變量都 必須 單獨成行,而列表的右括號與閉包的開始花括號 必須 放在同一行。

以下幾個例子,包含了參數和變量列表被分成多行的多情況。

<?php $longArgs_noVars = function ( $longArgument, $longerArgument, $muchLongerArgument) { // body};$noArgs_longVars = function () use ( $longVar1, $longerVar2, $muchLongerVar3) { // body};$longArgs_longVars = function ( $longArgument, $longerArgument, $muchLongerArgument) use ( $longVar1, $longerVar2, $muchLongerVar3) { // body};$longArgs_shortVars = function ( $longArgument, $longerArgument, $muchLongerArgument) use ($var1) { // body};$shortArgs_longVars = function ($arg) use ( $longVar1, $longerVar2, $muchLongerVar3) { // body};

注意,閉包被直接用作函數或方法調用的參數時,以上規則仍然適用。

<?php $foo->bar( $arg1, function ($arg2) use ($var1) { // body }, $arg3);

相關閱讀:

【開發規范】老生常談的PHP編碼開發規范你懂多少?

參考資料:

https://psr.phphub.org/

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/258640.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/258640.shtml
英文地址,請注明出處:http://en.pswp.cn/news/258640.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

faster rcnn學習之rpn訓練全過程

上篇我們講解了rpn與fast rcnn的數據準備階段&#xff0c;接下來我們講解rpn的整個訓練過程。最后 講解rpn訓練完畢后rpn的生成。 我們順著stage1_rpn_train.pt的內容講解。 name: "VGG_CNN_M_1024" layer {name: input-datatype: Pythontop: datatop: im_infotop: …

BitMapData知識 轉

Bitmap和BitmapData 2010.5.25 smartblack整理 一、flash.display.Bitmap類及其兩個子類 1、繼承自DisplayObject&#xff0c;和InteractiveObject平級&#xff0c;所以無法調度鼠標事件&#xff0c;可以使用額外的包裝容器(Sprite)來實現偵聽。 2、只支持GIF、JPEG、PNG格式&a…

Android學習之高德地圖的通用功能開發步驟(二)

周一又來了&#xff0c;我就接著上次的開發步驟&#xff08;一&#xff09;來吧&#xff0c;繼續把高德地圖的相關簡單功能分享一下 上次寫到了第六步&#xff0c;接著寫第七步吧。 第七步&#xff1a;定位 地圖選點 路徑規劃 實時導航 以下是我的這個功能NaviMapActivity的…

Oracle中分區表中表空間屬性

Oracle中的分區表是Oracle中的一個很好的特性&#xff0c;可以把大表劃分成多個小表&#xff0c;從而提高對于該大表的SQL執行效率&#xff0c;而各個分區對應用又是透明的。分區表中的每個分區有獨立的存儲特性&#xff0c;包括表空間、PCT_FREE等。那分區表中的各分區表空間之…

期刊論文格式模板 電子版_期刊論文的框架結構

最近看到很火的一句話&#xff0c;若不是生活所迫&#xff0c;誰愿意把自己弄得一身才華。是否像極了正想埋頭苦寫卻毫無頭緒的你&#xff1f;發表期刊論文的用途 &#xff1a;1: 學校或者單位評獎&#xff0c;評優&#xff0c;推免等2&#xff1a;申領學位證(如畢業硬性要求&a…

faster rcnn學習之rpn 的生成

接著上一節《 faster rcnn學習之rpn訓練全過程》&#xff0c;假定我們已經訓好了rpn網絡&#xff0c;下面我們看看如何利用訓練好的rpn網絡生成proposal. 其網絡為rpn_test.pt # Enter your network definition here. # Use ShiftEnter to update the visualization. name: &q…

初學java之常用組件

1 2 import javax.swing.*;3 4 import java.awt.*;5 class Win extends JFrame6 {7 JTextField mytext; // 設置一個文本區8 JButton mybutton;9 JCheckBox mycheckBox[]; 10 JRadioButton myradio[]; 11 ButtonGroup group; //為一…

anaconda 安裝在c盤_最省心的Python版本和第三方庫管理——初探Anaconda

打算把公眾號和知乎專欄的文章搬運一點過來。 歷史文章可以去關注我的公眾號&#xff1a;不二小段&#xff0c;或者知乎&#xff1a;段小草。也歡迎來看我的視頻學Python↓↓↓跟不二學Python這篇文章可以作為Python入門的第一站可以結合這期視頻來看&#xff0c;基本上是這期視…

Iris recognition papers in the top journals in 2017

轉載自&#xff1a;https://kiennguyenstuff.wordpress.com/2017/10/05/iris-recognition-papers-in-the-top-journals-in-2017/ Top journals: – IEEE Transaction on Pattern Analysis and Machine Intelligence (PAMI) – Pattern Recognition (PR) – IEEE Transaction on…

判斷瀏覽器是否為IE內核的最簡單的方法

沒啥說的&#xff0c;直接貼代碼&#xff0c;算是ie hack了。 if (![1,]) {alert(is ie); } 轉載于:https://www.cnblogs.com/jasondan/p/3716660.html

dubbo控制中心部署,權重配置,以及管控臺中各個配置的簡單查看

dubbo給我們提供了現成的后臺管理網站&#xff0c;專門管理這些服務&#xff0c;應用&#xff0c;路由規則&#xff0c;動態配置&#xff0c;訪問控制、權重控制、負載均衡等等&#xff0c;還可以查看系統日志&#xff0c;系統狀態&#xff0c;系統環境等等&#xff0c;功能很是…

給git配置http代理

1. 安裝socat apt-get install socat 2. 創建配置文件&#xff0c;取名gitproxy填入以下內容&#xff1a; #!/bin/sh_proxy135.245.48.33_proxyport8000 exec socat STDIO PROXY:$_proxy:$1:$2,proxyport$_proxyport 加上可執行權限chmod x gitproxy&#xff0c;將此文件放在環…

faster rcnn在自己的數據集上訓練

本文是一個總結&#xff0c;參考了網上的眾多資料&#xff0c;匯集而成&#xff0c;以供自己后續參考。 一般說來&#xff0c;訓練自己的數據&#xff0c;有兩種方法&#xff1a;第一種就是將自己的數據集完全改造成VOC2007的形式&#xff0c;然后放到py-faster-rcnn/data 目錄…

1001種玩法 | 1001種玩法--數據存儲(2)

新智云www.enncloud.cn第二趴 Flockdb&#xff1a;一個高容錯的分布式圖形數據庫 FlockDB是一個存儲圖數據的分布式數據庫&#xff0c;圖數據庫的存儲對象是數學概念圖論里面的圖&#xff0c;而非圖片。Twitter使用它來存儲人與人之間的關系圖&#xff0c;這些關系包括&#xf…

python邏輯量有什么_Python中的邏輯運算符有什么?

邏輯運算符用于組合多個條件測試語句。假設“我今年18歲”和“我身高2米”這兩個語句&#xff0c;前一個語句是真的&#xff0c;后一個語句是假的&#xff0c;因此&#xff0c;“我今年18歲&#xff0c;并且我身高2米”這個語句是假的。其中&#xff0c;“并且”可以認為是邏輯…

時區日期處理及定時 (NSDate,NSCalendar,NSTimer,NSTimeZone)

NSDate存儲的是世界標準時(UTC)&#xff0c;輸出時需要根據時區轉換為本地時間 Dates NSDate類提供了創建date&#xff0c;比較date以及計算兩個date之間間隔的功能。Date對象是不可改變的。 如果你要創建date對象并表示當前日期&#xff0c;你可以alloc一個NSDate對象并調用in…

Android ListView分頁,動態添加數據

1.ListView分頁的實現&#xff0c;重點在于實現OnScrollListener接口&#xff0c;判斷滑動到最后一項時&#xff0c;是否還有數據可以加載&#xff0c; 我們可以利用listView.addFootView(View v)方法進行提示 自定義一個ListView&#xff08;這里本來想進行一些自定已修改的。…

faster rcnn的測試

當訓練結束后&#xff0c;faster rcnn的模型保存在在py-faster-rcnn/output目錄下&#xff0c;這時就可以用已有的模型對新的數據進行測試。 下面簡要說一下測試流程。 測試的主要代碼是./tools/test_net.py&#xff0c;并且使用到了fast_rcnn中test.py。 主要流程就是&…

python重點知識 鉆石_python——子類對象如何訪問父類的同名方法

1. 為什么只說方法不說屬性關于“子類對象如何訪問父類的同名屬性“是沒有意義的。因為父類的屬性子類都有&#xff0c;子類還有父類沒有的屬性&#xff0c;在初始化時&#xff0c;給子類對象具體化所有的給定屬性&#xff0c;完全沒必要訪問父類的屬性&#xff0c;因為是一樣的…

Android-Universal-Image-Loader 的使用說明

這個圖片異步載入并緩存的類已經被非常多開發人員所使用&#xff0c;是最經常使用的幾個開源庫之中的一個&#xff0c;主流的應用&#xff0c;隨便反編譯幾個火的項目&#xff0c;都能夠見到它的身影。但是有的人并不知道怎樣去使用這庫怎樣進行配置&#xff0c;網上查到的信息…