PHP - 編碼規範 v1.0

1、 命名規則

1. 命名規則概要

1) 使用含義豐富的名字php

# good
if ($currentYear > 2009) ...

# bad
if($t > 2009) ...

2) 在縮寫中,只將首字母大寫html

# good
function getHttpHost()

#bad
function getHTTPHost()

2. 類命名

1) 類應該以名詞單數形式, 首字母大寫, 大小寫混排,方式命名mysql

class SqlStatement {    ...    }

2) 表示一組事物的類應使用複數形式sql

class SqlStatements {    ...    }

3) 類型開頭要比以類型結尾更容易識別
對一個已知類型的變量來講, 其名稱以類型開頭要比以類型結尾更容易識別數組

class ErrorConnection extends Error {
    // ...    
}     

$arrCatids = array(1,2,3,4,5,6);
$strCatids = ‘1,2,3,4,5,6’;

4) 接口的默認實現類能夠以Default開頭markdown

class DefaultSqlBuilder extends ISqlBuilder {
    //...    
}

3. 接口命名

接口的名字應爲以字母」I」開頭的名詞或形容詞框架

interface ISqlEngine{}    interface ISortable{}

4. 變量/屬性命名

1) 屬性名應以小寫字母開頭, 採用駝峯法則.ide

public $userAuth;

3) 常量的名字必須所有爲大寫字母
全部字母大寫,單詞之間用下劃線分割函數

const SEARCH_GOOGLE = 1;    
const SEARCH_YAHOO  = 2;

4) 命名一組對象時,應使用複數形式typecho

public $books;

5) 布爾型變量不該使用否認性名字

# good
public $isFound;    
public $isEnough;

# bad
public $isNotFound;    
public $isNotEnough;

6) 在嵌套循環中,使用有意義豐富的名字來命名循環控制變量

# good
for($row = 0; $i < getRows();$row++) {    
    for($col= 0;$j < getCols(); $col++) {
        // ...    
    }    
}

# bad
for($i = 0; $i < getRows();$i++) {
    for($j= 0;$j < getCols(); $j++){
        // ...    
    }    
}

7) 傳入的變量採用蛇形寫法, 自定義函數變量採用蛇形寫法

# 控制器變量
class UserController extends Controller{
    function postLogin(Request $request) {
        // 這裏是蛇形寫法
        $order_status = $request->input('order_status');
    }
}

# 自定義函數變量
# 這裏傳入的變量採用蛇形寫法
function route_url($route, $params, $option_params){
    // ...
}

5. 函數命名

禁止拼音命名法

1) 類函數名稱以小寫字母開頭, 採用駝峯法則

function getCurrentYear()

2) 用動詞命名函數

# 動詞表:
add / edit / remove 
begin / end
create / destroy
first / last 
get / release
get / set
increment / decrement
put / get
lock / unlock 
open / close
min / max 
old / new 
start / stop
next / previous 
source / target 
show / hide
send / receive
cut / paste 
up / down

# 系詞表:
is / has
function startDatabase()
function getDatabaseStatus()

3) 函數名字能夠忽略類或對象名稱,以免重複

# good
class Font {
    function getFamily();
}

# bad
class Font {    
    function getFontFamily();
}

4) 單例類應該經過一個名爲getInstance()的靜態函數返回他們惟一的值

class Toolkit {    
    private static const toolkit = new Toolkit();
    public static function getInstance(){
        return toolkit; 
    }    
}

2、 文件格式/ 技巧

1. 留白

恰當的使用空格能夠有效提升代碼的可讀性

1) 使用空格的通用規則

  1. 操做符,冒號的先後都應有一個空格.

  2. 逗號,分號以後須有一個空格

# good
$bit = $bitStart + $bitEnd;
case 'someStr' :
mysqlConnection($config, $dbname);
if($count > 9)

#bad
$bit=$bitStart+$bitEnd;    
case 'someStr':    
mysqlConnection($config,$dbname);
if($count>9)

2) 邏輯單元應該以空行分割

function drawCapture() {    
    $chars = getChars(5);
    
    // imageCreate
    $img = imageCreate();
    
    // output image
    outputImage();    
}

2. 控制流程

1) for,while,if語句格式以下

# for
for (init; condition; update) {    
    // ...    
} 

# while
while (condition) {    
    // ...    
} 

# if
if (condition) {
    // ...    
} else if (condition) {    
    // ...    
} else {
    // ...    
}

2) 循環/條件語句必須以 ‘{‘ , ’}’嵌套

# good
if ($i > 0) {
    $val ++;    
}
for ($i = 0; $i < $size; $i++) {    
    $val ++;    
}

# bad 
for($i=0; $i<$size; $i++)    $val ++;
if($i > 0)    $val ++;

3) 使用臨時變量以免複合條件語句

# good
$itemValid = $itemMoney > 800 && $level > 3 && $valid > 0;
if($itemValid && isReady()) {
    display();    
}

# bad
if($itemMoney > 800 && $level > 3 && $valid > 0 && isReady()) {    
    display();    
}

4) Switches 語句應該套用如下格式,而且每一個分支必須註釋清楚

switch (condition) {
    case 0:            
    // show something
        break;    
    default:
    // this is some code
}

3. 聲明

1) 類/接口聲明順序
類文檔中的語句的順序.

1.    文檔/註釋
2.    類/接口語句
3.    常量
4.    靜態變量順序:[public, protected, (default), private]
5.    實例變量順序:[public, protected, (default), private]
6.    構造函數 __construct();
7.    函數 function;

2) 變量的聲明要在代碼塊的開頭,而不是在用到它們的地方

public function method() {
    $value = 0;
    ...    
    for (...) {    
        $value += $num;    
    }    
}

4. 技巧

刪除文件尾部的 ?>

php文件的典型標記是以 <?php開頭, ?>結尾。可是在Zend Framework中卻不推薦在php文件末尾加 ?>
由於在<?php ?>以外的任何字符都會被輸出到網頁上,而之中的卻不會。因此在末尾不加?>能夠預防php文件被惡意加入字符輸出到網頁。

數組的鍵名

在PHP中, 使用不經單引號包含的字符串做爲數組鍵名是合法的, 可是咱們不但願如此 -- 鍵名應該老是由單引號包含而避免引發混淆. 注意這是使用一個字符串, 而不是使用變量作鍵名的狀況

// 錯誤    
$foo = $assoc_array[blah];
// 正確
$foo = $assoc_array['blah'];
// 錯誤
$foo = $assoc_array["$var"];
// 正確    
$foo = $assoc_array[$var];

不要使用未初始化的變量

// 錯誤    
if ($forum) ...
// 正確
if (isset($forum)) ...
// 正確    
if (isset($forum) && $forum == 5)

避免在大數組上使用 in_array()

避免在大的數組上使用 in_array(), 同時避免在循環中對包含200個以上元素的數組使用這個函數. in_array()會很是消耗資源. 對於小的數組這種影響可能很小, 可是在一個循環中檢查大數組可能會須要好幾秒鐘的時間. 若是您確實須要這個功能, 請使用isset()來查找數組元素. 其實是使用鍵名來查詢鍵值. 調用 isset($array[$var]) 會比 in_array($var, array_keys($array)) 要快得多.

SQL 腳本格式

SQL 代碼經常會變得很長, 若是不做必定的格式規範, 將很難讀懂. SQL代碼通常按照如下的格式書寫, 以關鍵字換行:

$sql = 'SELECT *     
<-one tab->FROM ' . SOME_TABLE . ' 
<-one tab->WHERE a = 1 
<-two tabs->AND (b = 2 
<-three tabs->OR b = 3)     
<-one tab->ORDER BY b';

這裏是應用了製表符後的例子:

$sql = 'SELECT *
    FROM ' . SOME_TABLE . ' 
    WHERE a = 1 
        AND (b = 2 
            OR b = 3)        
    ORDER BY b';

禁止使用單字母開頭的變量

$tKey, $tVal

5. 空行的使用

  • <?php 以後必須有1個空行

  • 兩個函數之間必須有1個空行。

  • return、die、exit以前若是有其餘語句的狀況下應加上一個空行

3、 文檔與註釋

1. PHPDoc

PHPDoc 是一個 PHP 版的 Javadoc。它是一種註釋 PHP 代碼的正式標準。它支持經過相似 phpDocumentor 這樣的外部文檔生成器生成 API 文檔,也能夠幫助一些例如 Zend Studio, NetBeans, ActiveState Komodo Edit and IDE 和 Aptana Studio 之類的 集成開發環境 理解變量類型和弱類型語言中的其餘歧義並提供改進的代碼完成,類型提示和除錯功能。
參考地址: http://zh.wikipedia.org/zh/PH...

2. 註釋

註釋類

/**
 * 這是某個類的介紹
 */    
class SomeClass{}

註釋局部變量

function someFunction(){    
    var $result;          //獲取到的結果集
    var $searchResult;   //獲取到的搜索結果集    
    // ...
}

註釋變量

/** @var name string */
public $name

註釋函數
註釋的標記應按照如下順序

*     @param
*     @return
*     @see

3. PHP文檔頭部註釋

/**
 * 文件頭部說明
 * 
 * @author     Mark (zhaody901@126.com)
 * @copyright  Copyright (c) 2014-2016 sour-lemon team
 */

框架經常使用命名

控制器方法

getIndex()     # 列表
getCreate()    # 建立
postCreate()   # 保存建立
getEdit()      # 編輯
postEdit()     # 保存編輯
postUpdate()   # 批量更新
postDelete()   # 刪除到回收站
postDestroy()  # 完全刪除

附錄Appendices

附錄A:參考文檔

附錄B:PHPDoc 標籤參考

在線版地址 : http://manual.phpdoc.org/HTML...

@abstract        Documents an abstract class, class variable or method.
@access    public, private or protected    Documents access control for an element. @access private indicates that documentation of element be prevented.
@author    author name <author@email>    Documents the author of the current element.
@category        Specify a category to organize the documented element’s package into
@copyright    name date    Documents copyright information.
@deprecated    version    Documents a method as deprecated.
@example    /path/to/example    Documents the location of an external saved example file.
@exception        documents an exception thrown by a method — also see @throws.
@global    type $globalvarname    Documents a global variable or its use in a function or method.
@ignore        Prevents the documentation of an element
@internal        private information for advanced developers
@link    URL    
@name    global variable name    Specifies an alias for a variable. For example, $GLOBALS[‘myvariable’] becomes $myvariable
@magic        phpDocumentor tags}-.
@package    name of a package    Documents a group of related classes and functions.
@param    type [$varname] description    
@return    type description    This tag should not be used for constructors or methods defined with a void return type.
@see        Documents an association to another method or class.
@since    version    Documents when a method was added to a class.
@static        Documents a static class or method
@staticvar        Documents a static variable’s use in a function or class
@subpackage        
@throws        Documents an exception thrown by a method.
@todo        Documents things that need to be done to the code at a later date.
@var    type    a data type for a class variable
@version        Provides the version number of a class or method.

附錄C: 版本變化

v1.4(2016年10月07日)

更改成markdown格式, 而且將其替換爲Laravel 編碼格式

V1.3(2015年4月19日)

項目文件結構說明

V1.2(2013年4月27日)

分離項目公共部分

V1.1(2013年4月2日)

增長左格式化內容
增長刪除 ?> 標記

V1.0(2012年11月7日)

初始化規範

相關文章
相關標籤/搜索