本文主要和大家分享PHP程式碼樣式風格規格,希望能幫助大家。
一、基本約定
1、原始檔
(1)、純PHP程式碼原始檔只使用 ;
(2)、原始檔中PHP程式碼的編碼格式必須是無BOM的UTF-8格式;
(3)、使用Unix LF(換行符號)作為行結束符號;
(4)、一個原始檔案只做一種類型的聲明,即,這個檔案專門用來聲明Class, 那個檔案專門用來設定設定訊息,別混在一起寫;
2、縮排
使用Tab鍵來縮減,每個Tab鍵長度設定為4個空格;
3、行
一行推薦的是最多寫120個字符,多於這個字符就應該換行了,一般的編輯器是可以設定的。
//wo
補一條不出現橫滾屏和豎滾屏,
4、關鍵字和True/False/Null
PHP的關鍵字,必須小寫,boolean值:true,false,null 也必須小寫。
下面是PHP的“關鍵字”,必須小寫:
'__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'
5、命名
(1)、類別名稱使用大駝峰式(StudlyCaps)寫法;
(2)、(類別的)方法名稱使用小駝峰(cameCase)寫法;
( 3)、函數名稱使用小寫字母+ 底線寫法,如function http_send_post();
(4)、變數名稱使用小駝峰寫法,如$userName;
6、程式碼註解標籤
如函數註解、變數註解等,常用標籤有 @package、@var、@param、@return、@author、@todo、@throws
必須遵守phpDocument 標籤規則,不要另外去創造新的標籤,更多標籤查看 phpDocument官網
7、業務模組
(1)、涉及多個資料表更新/新增作業時,最外層要用事務,確保資料庫操作的原子性;
(2)、Model層,只做簡單的資料表的查詢;
(3)、業務邏輯統一封裝到Logic層;
(4)、控制器只做URL路由,不要當作業務方法呼叫;
(5)、控制器層不能出現SQL操作語句,如 ThinkPHP框架的where()、 order() 等模型方法,
即,控制器中,不要出現類似這樣的SQL語句:D('XXX')->where()->order()->limit( )->find();
where()、order()、limit() 等SQL方法只能出現在Model層、業務層!
二、程式碼樣式風格
1、命名空間(Namespace) 和導入(Use)宣告
先簡單文字描述下:
命名空間(namespace)的宣告後面必須有一行空行;
所有的導入(use)宣告必須放在命名空間(namespace)宣告的下面;
一句宣告中,必須只有一個導入(use)關鍵字;
#在導入(use)宣告程式碼區塊後面必須有一行空行;
用程式碼來說明下:
1
2
3
4
5
# 6
|
namespace Lib\Databases; // 下方必須空格一行 #class Mysql { } |
#namespace下空一行,才能使用use,再空一行,才能宣告class
1 2 3 4 5 #6 7 8 9 10 | namespace Lib\Databases; // 下方必須一行 use FooInterface; // use 必須在namespace 後面宣告 use BarClass as Bar; #」Bar;##Bar; ##Bar;##Bar; ##Bar; #use OtherVendor\OtherPackage\BazClass; // 下方必須空格一行 class Mysql { |
}
########### ################ #######
2、類別(class),屬性(property)和方法(method)
(1)、繼承(extends) 和實作(implement) 必須和 class name 寫在一行。
1 2 #3 4 5 6 | namespace Lib\Databaes; class Mysql extends ParentClass implements \PDO , \DB { // 寫一行 } |
#(2)、屬性(property)必須宣告其可見性,到底是 public 還是protected 還是 private,不能省略,也不能使用var, var是php老版本中的什麼方式,等用於public。
1 2 #3 4 5 6 7 8 | namespace Lib\Databaes; # class Mysql extends ParentClass implements \PDO, \DB { // 寫一行 public $foo = null;# # protected $age = '17';} | #(3)、方法(method),必須 宣告其可見性,到底是 public 還是 protected 還是 private,不能省略。如果有多個參數,第一個參數後緊接「,」 ,再加一個空格:function_name ($par, $par2, $pa3), 如果參數有預設值,「=」左右各有一個空格分開。
1 2 #3 4 5 6 7 8 | namespace Lib\Databaes; # class Mysql extends ParentClass implements \PDO, \DB { // 寫一行 public getInfo($name, $age, $gender = 1) { 空格。預設參數的「=」左右各有一個空格,) 與{ 之間有一個空格 # } #} |
(4)、當用到抽象(abstract)和終結(final)來做類別宣告時,它們必須放在可見性宣告(public 還是protected還是private)的前面。而當用到靜態(static)來做類別宣告時,則必須放在可見性宣告的後面。
直接上程式碼:
1 #2 3 4 5 6 7 8 #9 #10 #11 | ##namespace Vendor\Package; abstract class ClassName { protected static $foo; // static放後面 abstract protected function zim(); // abstract放前面 前面,static放下最後。 // 方法主體部份 }} |
###################################################################################3、控制結構
控制接口,就是 if else while switch等。這一類的寫法規範也是常常容易出現問題的,也要規範一下。
(1)、if,elseif,else寫法,直接上規範代碼吧:
##123456#78 | if ($expr1) { // if 與( 之間有一個空格,) 與{ 之間有一個空格 # } elseif ($expr2) { // elesif 連著寫,與( 之間有一個空格,) 與{ 之間有一個空格 #} else { // else 左右各一個空格 } |
#(2)、switch,case 注意空格與換行,還是直接上規範程式碼:123456789#10#1112 1314151617 | switch ($expr) { // switch 與( 之間有一個空格,) 與{ 之間有一個空格 case 0: a break'; // 對位 break; // 換行寫break,同樣對齊。 case 1: echo 'Second case, which falls through'; # 2 case 3: case 4:# echo 'Third case, return instead of break, ## # echo 'Default case'; break;} (3)、while,do while 的寫法也類似,上碼: while ($expr) { // while 與( 之間有一個空格, ) 與{ 之間有一個空格 ##} do { // do 與{ 之間有一個空格# } while ($expr); // while 左右各有一個空格 | (4)、for的寫法1 | #2 3######4############(5)、foreach的寫法1 2 ##34 | foreach ($iterable as $key => $value) { // foreach 與( 之間有一個空格,"=> ;" 左右各有一個空格,) 與{ 之間有一個空格
}
|
(6) 、try catch的寫法
1#23 ##4
5
6
7
8
| #try { // try右邊有一個空格 } catch (FirstExceptionType $e) { // catch 與( 之間有一個空格,) 與{ 之間有一個空格 # } catch (OtherExceptionType $e) { // catch 與( 之間有一個空格,) 與{ 之間有一個空格 } #4、註解(1)、行註解 // 後面需要加一個空格; 如果// 前面有非空字符,則//前面需要加一個空格; (2)、函數註解 參數名稱、屬性名稱、標籤的文字上下要對齊; 在第一個標籤前加一個空白行; 1 2 ##3##4 # 5 6 7 8 9 10 11 ##12 13141516## /** | * 這是一個範例函數,用來說明其他PHP * 格式化程式選項。參數 * @param int $two 第二個參數 * @param string $third 第三個參數有較長的 * 。 */ function foo($one, $two = 0, $three = "String") { # } #} 5、空格(1)、賦值運算子(=,+= 等)、邏輯運算子(&&,||)、等號運算子(==,!=)、關係運算子(<,>,<=,>=)、位元運算子(&,|,^)、連接符號(.) 左右各有一個空格; (2) 、if,else,elseif,while,do,switch,for,foreach,try,catch,finally 等與緊捱的左括號「(」之間有一個空格;
(3)、函數、方法的各個參數之間,逗號(",")後面有一個空格;
6、空行
(1)、所有左花括號 { 都不換行,且 { 緊挨著的下方,一定不是空白行;
(2)、同級程式碼(縮排相同)的 註解(行註解/區塊註解)前面,必須有一個空白行;
(3)、各個方法/函數之間都有一個空白行;
(4)、namespace語句、use語句、clase語句之間都有一個空白行;
(5) 、return語句
如果return 語句之前只有一行PHP程式碼,return 語句之前不需要空行;
如果return 語句之前有至少二行PHP程式碼,return 語句之前加一個空白行;
(5)、if,while,switch,for,foreach、try 等程式碼區塊之間以及 與其他程式碼之間有一個空白行;
5######6#######7######8######### ###參考2:1 2 ##3##4 #5 6 7 8 9 10 ##11 | namespace Vendor\Package; abstract class ClassName { protected static $foo; # / static放後面 abstract protected function zim(); // abstract在前面 final最後。 // 方法主體部份 }} | #############################################################################參考3: 1 2 ##3##4 #5 6 7 8 9 10 ##11 #12131415#161718 # 192021222324#25# 26 272829#30#31#32#33 3435363738 | 39404142434445命名空間庫\模型;使用庫\Helper\ImageHelper;使用庫\Logic\UserMainLogic; /** * 使用者表 資料模型 * * @package library\Model */類別UserMainModel 擴充BasicModel { /** * 取得使用者統計資料 * * @param int $userId 使用者ID # */ 公共函數getUserCard($userId ) { $userId = intval($userId); return UserMainLogic:: # /** * 依照Id 取得使用者資訊 ## * * @param int $userId 使用者Id## * @return array */ 公用函數 getByUserId($userId = 0, $field = '*') {# 問; $info = $this->field($field)->where($where)->find(); • 。 ]); } # return $info; ## ##參考4: 1 2 ##3##4 #5 6 7 8 9 10 ##11 #12131415#161718 # 192021222324#25 | # 26 2728$serv = new swoole_server("127.0.0.1", 9502); // 設定伺服器配置,我們將task_worker_num配置設為大於0以啟用任務工作者支援$serv->set(array('task_worker_num' => 4)); // 附加接收事件的處理程序,上面已經解釋過。 $ data) { // 我們透過呼叫 $serv# 的 task() 方法將任務分發給任務工作人員 // 此方法傳回一個任務 id 作為此任務的識別 $task_id = $serv->task($data); echo “Dispath AsyncTask:id=$task_id\n”;}); // 為任務事件附加處理程序,該處理程序將在任務工作執行緒中執行。 , $from_id, $data) { // 處理任務,用$data 做你想做的事 echo "New AsyncTask[id=$task_id]".PHP_EOL; //任務任務處理完成後,我們將結果回傳給呼叫者worker。 OK");}); //為完成事件附加處理程序,該處理程序將在伺服器工作人員中執行,並且在同一工作人員之前調度了這個任務。 .PHP_EOL; }); | #$serv->start();############### 總結:所有左花括號 { 都不換行,且 { 緊鄰的下方,一定不是空行! 上面的 程式碼樣式規範,參考了 Java、JavaScript、Objective-C、Go 等開發語言的規格! Java語言對中國程式設計師影響太深,大部分人還是習慣把 左花括號 { 不換行! 書寫原則:做到 程式碼緊湊 而又不失去 小模組化 !
PSR-4 規範#PSR-4規格是剛出沒多久的一條新的規範,它也是規範自動載入(autoload)的,是PSR-0的修改,屬於補充規範, 我簡單說下,主要是以下幾點: 廢除了PSR-0中_就是目錄分割符的寫法,_底線在完全限定類別名稱中是沒有特殊意義了。 類別檔案名稱要以 .php 結尾。 類別名稱必須和對應的檔案名稱要一模一樣,大小寫也要一模一樣。
參考: 程式碼風格研究:左花括號 是否換行? ? ? PHP中PSR-[0-4]程式碼規格 【補充】數組的書寫格式#只有一個鍵值對時,就寫成一行: 1 | $where = array('id' => 789); |
有多個(二或二個以上)鍵值對時,就換行:
1
2
3
4
|
$where = array(
# 'id' => 789,
'user_name' => 'phpgo'
);
|
相關推薦:
ThinkPHP 3.2.3 分頁程式碼樣式分享
PHP程式碼樣式
##################################################### php關於編碼規格的文檔(收藏)#######以上是PHP程式碼樣式風格規範分享的詳細內容。更多資訊請關注PHP中文網其他相關文章! 陳述:本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn |
|
|