首頁 >後端開發 >php教程 >PHP程式碼樣式風格規範分享

PHP程式碼樣式風格規範分享

小云云
小云云原創
2018-03-05 10:30:424298瀏覽

本文主要和大家分享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)宣告

先簡單文字描述下:

  1. 命名空間(namespace)的宣告後面必須有一行空行;

  2. 所有的導入(use)宣告必須放在命名空間(namespace)宣告的下面;

  3. 一句宣告中,必須只有一個導入(use)關鍵字;

  4. #在導入(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。

#

(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 $foo = null;# 

#    protected $age = '17';

}

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寫法,直接上規範代碼吧:

##1

2

3

4

5

6

#7

8

if ($expr1) { // if 與( 之間有一個空格,) 與{ 之間有一個空格

 

# } elseif ($expr2) { // elesif 連著寫,與( 之間有一個空格,) 與{ 之間有一個空格

 

#} else { // else 左右各一個空格

 

}

#(2)、switch,case 注意空格與換行,還是直接上規範程式碼:

1

2

3

4

5

6

7

8

9

#10

#11

12

13

14

15

16

17

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 的寫法也類似,上碼:

< ;?php

# #3

4

5

6

7

8

while ($expr) { // while 與( 之間有一個空格, ) 與{ 之間有一個空格

 ##}#2
 

do { // do 與{ 之間有一個空格

} while ($expr); // while 左右各有一個空格

(4)、for的寫法

1
3######4############(5)、foreach的寫法

1

2

##3

4

foreach ($iterable as $key => $value) { // foreach 與( 之間有一個空格,"=> ;" 左右各有一個空格,) 與{ 之間有一個空格

 

}

(6) 、try catch的寫法

#

try { // try右邊有一個空格

 

} catch (FirstExceptionType $e) { // catch 與( 之間有一個空格,) 與{ 之間有一個空格

} catch (OtherExceptionType $e) { // catch 與( 之間有一個空格,) 與{ 之間有一個空格

 

}

#

4、註解

(1)、行註解

// 後面需要加一個空格;

如果// 前面有非空字符,則//前面需要加一個空格;

(2)、函數註解

參數名稱、屬性名稱、標籤的文字上下要對齊;

在第一個標籤前加一個空白行;

1

#2

3

##4

5

6

7

8

1

2

##3

##4

# 5

6

7

8

9

10

11

##12

13

14

15

16

## /**

 * 這是一個範例函數,用來說明其他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 等程式碼區塊之間以及 與其他程式碼之間有一個空白行;

 


4

 

【參考範例總結】

參考1:

1

2

3
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

#12

13

14

15

#16

17

18

# 19

20

21

22

23

24

#25

# 26

27

28

29

#30

#31

#32

#33

34

35

36

37

38
39

40

41

42

43

44

45

命名空間庫\模型;

使用庫\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

#12

13

14

15

#16

17

18

# 19

20

21

22

23

24

#25

# 26

27

28

$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的修改,屬於補充規範,

我簡單說下,主要是以下幾點: 

  1. 廢除了PSR-0中_就是目錄分割符的寫法,_底線在完全限定類別名稱中是沒有特殊意義了。 

  2. 類別檔案名稱要以 .php 結尾。 

  3. 類別名稱必須和對應的檔案名稱要一模一樣,大小寫也要一模一樣。

 

 

參考:

程式碼風格研究:左花括號 是否換行? ? ?

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