PHP 開發(fā)規(guī)范

2018-02-24 15:41 更新

PHP 開發(fā)規(guī)范

CodeIgniter 的開發(fā)遵循本頁所描述的編碼規(guī)范,我們也推薦在你自己的應(yīng)用程序開發(fā)中使用 這些規(guī)范,但不做強(qiáng)求。

目錄

文件格式

文件應(yīng)該保存為 Unicode(UTF-8)編碼格式,不要使用?字節(jié)序標(biāo)記(BOM),和 UTF-16 和 UTF-32 不一樣, UTF-8 編碼格式的文件不需要指定字節(jié)序。而且 BOM 會(huì)在 PHP 的輸出中產(chǎn)生副作用, 它會(huì)阻止應(yīng)用程序設(shè)置它的頭信息。另外,所有的換行符應(yīng)該使用 Unix 格式換行符(LF)。

以下是在一些常見的文本編輯器中更改這些設(shè)置的方法。針對你的編輯器,方法也許會(huì)有所不同, 請參考你的編輯器的說明。

TextMate

  1. 打開應(yīng)用程序設(shè)置
  2. 點(diǎn)擊 "高級" ,切換到 "保存" 標(biāo)簽頁。
  3. 在 "文件編碼" 中,選擇 "UTF-8(推薦)"
  4. 在 "換行符" 中,選擇 "LF(推薦)"
  5. 可選:如果你想對現(xiàn)有文件也能自動(dòng)作此設(shè)置,勾上 "同時(shí)應(yīng)用到已有文件" 選項(xiàng)

BBEdit

  1. 打開應(yīng)用程序設(shè)置
  2. 選擇左側(cè)的 "文本編碼"
  3. 在 "新文檔的默認(rèn)編碼",選擇 "Unicode (UTF-8, no BOM)"
  4. 可選:在 "如果無法檢測文件編碼,使用...",選擇 "Unicode (UTF-8, no BOM)"
  5. 選擇左側(cè)的 "文本文件"
  6. 在 "默認(rèn)的換行符" 中,選擇 "Mac OS X and Unix (LF)"

PHP 結(jié)束標(biāo)簽

PHP 結(jié)束標(biāo)簽??>?對于 PHP 解析器來說是可選的,但是只要使用了,結(jié)束標(biāo)簽之后的空格 有可能會(huì)導(dǎo)致不想要的輸出,這個(gè)空格可能是由開發(fā)者或者用戶又或者 FTP 應(yīng)用程序引入的, 甚至可能導(dǎo)致出現(xiàn) PHP 錯(cuò)誤,如果配置了不顯示 PHP 錯(cuò)誤,就會(huì)出現(xiàn)空白頁面。基于這個(gè)原因, 所有的 PHP 文件將不使用結(jié)束標(biāo)簽,而是以一個(gè)空行代替。

文件的命名

類文件的命名必須以大寫字母開頭,其他文件(配置文件,視圖,一般的腳本文件等)的命名是全小寫。

錯(cuò)誤的:

somelibrary.php
someLibrary.php
SOMELIBRARY.php
Some_Library.php

Application_config.php
Application_Config.php
applicationConfig.php

正確的:

Somelibrary.php
Some_library.php

applicationconfig.php
application_config.php

另外,類文件的名稱必須和類的名稱保持一致,例如,如果你有一個(gè)類名為?Myclass?, 那么文件名應(yīng)該是?Myclass.php?。

類和方法的命名

類名必須以大寫字母開頭,多個(gè)單詞之間使用下劃線分割,不要使用駝峰命名法。

錯(cuò)誤的:

class superclass
class SuperClass

正確的:

class Super_class
class Super_class {

    public function __construct()
    {

    }
}

類的方法應(yīng)該使用全小寫,并且應(yīng)該明確指出該方法的功能,最好包含一個(gè)動(dòng)詞。 避免使用冗長的名稱,多個(gè)單詞之間使用下劃線分割。

錯(cuò)誤的:

function fileproperties()       // not descriptive and needs underscore separator
function fileProperties()       // not descriptive and uses CamelCase
function getfileproperties()        // Better!  But still missing underscore separator
function getFileProperties()        // uses CamelCase
function get_the_file_properties_from_the_file()    // wordy

正確的:

function get_file_properties()  // descriptive, underscore separator, and all lowercase letters

變量的命名

變量的命名規(guī)則和類方法的命名規(guī)則非常接近,使用全小寫,使用下劃線分割, 并且應(yīng)該明確指出該變量的用途。非常短的無意義的變量只應(yīng)該在 for 循環(huán)中作為迭代器使用。

錯(cuò)誤的:

$j = 'foo';     // single letter variables should only be used in for() loops
$Str            // contains uppercase letters
$bufferedText       // uses CamelCasing, and could be shortened without losing semantic meaning
$groupid        // multiple words, needs underscore separator
$name_of_last_city_used // too long

正確的:

for ($j = 0; $j < 10; $j++)
$str
$buffer
$group_id
$last_city

注釋

通常情況下,應(yīng)該多寫點(diǎn)注釋,這不僅可以向那些缺乏經(jīng)驗(yàn)的程序員描述代碼的流程和意圖, 而且當(dāng)你幾個(gè)月后再回過頭來看自己的代碼時(shí)仍能幫你很好的理解。 注釋并沒有強(qiáng)制規(guī)定的格式,但是我們建議以下的形式。

DocBlock?風(fēng)格的注釋,寫在類、方法和屬性定義的前面,可以被 IDE 識別:

/**
 * Super Class
 *
 * @package Package Name
 * @subpackage  Subpackage
 * @category    Category
 * @author  Author Name
 * @link    http://example.com
 */
class Super_class {
/**
 * Encodes string for use in XML
 *
 * @param   string  $str    Input string
 * @return  string
 */
function xml_encode($str)
/**
 * Data for class manipulation
 *
 * @var array
 */
public $data = array();

單行注釋應(yīng)該和代碼合在一起,大塊的注釋和代碼之間應(yīng)該留一個(gè)空行。

// break up the string by newlines
$parts = explode("\n", $str);

// A longer comment that needs to give greater detail on what is
// occurring and why can use multiple single-line comments.  Try to
// keep the width reasonable, around 70 characters is the easiest to
// read.  Don't hesitate to link to permanent external resources
// that may provide greater detail:
//
// http://example.com/information_about_something/in_particular/

$parts = $this->foo($parts);

常量

常量遵循和變量一樣的命名規(guī)則,除了它需要全部大寫。盡量使用 CodeIgniter 已經(jīng)定義好的常量, 如:SLASH、LD、RD、PATH_CACHE 等。

錯(cuò)誤的:

myConstant  // missing underscore separator and not fully uppercase
N       // no single-letter constants
S_C_VER     // not descriptive
$str = str_replace('{foo}', 'bar', $str);   // should use LD and RD constants

正確的:

MY_CONSTANT
NEWLINE
SUPER_CLASS_VERSION
$str = str_replace(LD.'foo'.RD, 'bar', $str);

TRUE、FALSE 和 NULL

TRUE?、?FALSE?和?NULL?這幾個(gè)關(guān)鍵字全部使用大寫。

錯(cuò)誤的:

if ($foo == true)
$bar = false;
function foo($bar = null)

正確的:

if ($foo == TRUE)
$bar = FALSE;
function foo($bar = NULL)

邏輯操作符

不要使用?||?操作符,它在一些設(shè)備上看不清(可能看起來像是數(shù)字 11), 使用?&&?操作符比使用?AND?要好一點(diǎn),但是兩者都可以接受。 另外,在!?操作符的前后都應(yīng)該加一個(gè)空格。

錯(cuò)誤的:

if ($foo || $bar)
if ($foo AND $bar)  // okay but not recommended for common syntax highlighting applications
if (!$foo)
if (! is_array($foo))

正確的:

if ($foo OR $bar)
if ($foo && $bar) // recommended
if ( ! $foo)
if ( ! is_array($foo))

對返回值進(jìn)行比較以及類型轉(zhuǎn)換

有一些 PHP 函數(shù)在失敗時(shí)返回 FALSE ,但是也可能會(huì)返回 "" 或 0 這樣的有效值, 這些值在松散類型比較時(shí)和 FALSE 是相等的。所以當(dāng)你在條件中使用這些返回值作比較時(shí), 一定要使用嚴(yán)格類型比較,確保返回值確實(shí)是你想要的,而不是松散類型的其他值。

在檢查你自己的返回值和變量時(shí)也要遵循這種嚴(yán)格的方式,必要時(shí)使用?===?和?!==?。

錯(cuò)誤的:

// If 'foo' is at the beginning of the string, strpos will return a 0,
// resulting in this conditional evaluating as TRUE
if (strpos($str, 'foo') == FALSE)

正確的:

if (strpos($str, 'foo') === FALSE)

錯(cuò)誤的:

function build_string($str = "")
{
    if ($str == "") // uh-oh!  What if FALSE or the integer 0 is passed as an argument?
    {

    }
}

正確的:

function build_string($str = "")
{
    if ($str === "")
    {

    }
}

另外關(guān)于?類型轉(zhuǎn)換?的信息也將很有用。 類型轉(zhuǎn)換會(huì)對變量產(chǎn)生一點(diǎn)輕微的影響,但可能也是期望的。例如 NULL 和 布爾值 FALSE 會(huì)轉(zhuǎn)換為空字符串, 數(shù)字 0 (和其他數(shù)字)將會(huì)轉(zhuǎn)換為數(shù)字字符串,布爾值 TRUE 會(huì)變成 "1":

$str = (string) $str; // cast $str as a string

調(diào)試代碼

不要在你的提交中包含調(diào)試代碼,就算是注釋掉了也不行。 像?var_dump()?、?print_r()?、?die()?和?exit()?這樣的函數(shù),都不應(yīng)該包含在你的代碼里, 除非它們用于除調(diào)試之外的其他特殊用途。

文件中的空格

PHP 起始標(biāo)簽的前面和結(jié)束標(biāo)簽的后面都不要留空格,輸出是被緩存的,所以如果你的文件中有空格的話, 這些空格會(huì)在 CodeIgniter 輸出它的內(nèi)容之前被輸出,從而會(huì)導(dǎo)致錯(cuò)誤,而且也會(huì)導(dǎo)致 CodeIgniter 無法發(fā)送正確的頭信息。

兼容性

CodeIgniter 推薦使用 PHP 5.4 或更新版本,但是它還得同時(shí)兼容 PHP 5.2.4 。 你的代碼要么提供適當(dāng)?shù)幕赝藖砑嫒葸@點(diǎn),要么提供一些可選的功能,當(dāng)不兼容時(shí)能安靜的退出而不影響用戶的程序。

另外,不要使用那些需要額外安裝的庫的 PHP 函數(shù),除非你能給出當(dāng)該函數(shù)不存在時(shí),有其他的函數(shù)能替代它。

一個(gè)類一個(gè)文件

除非幾個(gè)類是緊密相關(guān)的,否則每個(gè)類應(yīng)該單獨(dú)使用一個(gè)文件。 在 CodeIgniter 中一個(gè)文件包含多個(gè)類的一個(gè)例子是 Xmlrpc 類文件。

空格

在代碼中使用制表符(tab)來代替空格,這雖然看起來是一件小事,但是使用制表符代替空格, 可以讓開發(fā)者閱讀你代碼的時(shí)候,可以根據(jù)他們的喜好在他們的程序中自定義縮進(jìn)。 此外還有一個(gè)好處是,這樣文件可以更緊湊一點(diǎn),也就是本來是四個(gè)空格字符, 現(xiàn)在只要一個(gè)制表符就可以了。

換行

文件必須使用 Unix 的換行格式保存。這對于那些在 Windows 環(huán)境下的開發(fā)者可能是個(gè)問題, 但是不管在什么環(huán)境下,你都應(yīng)該確認(rèn)下你的文本編輯器已經(jīng)配置好使用 Unix 換行符了。

代碼縮進(jìn)

使用 Allman 代碼縮進(jìn)風(fēng)格。除了類的定義之外,其他的所有大括號都應(yīng)該獨(dú)占一行, 并且和它對應(yīng)的控制語句保持相同的縮進(jìn)。

錯(cuò)誤的:

function foo($bar) {
    // ...
}

foreach ($arr as $key => $val) {
    // ...
}

if ($foo == $bar) {
    // ...
} else {
    // ...
}

for ($i = 0; $i < 10; $i++)
    {
    for ($j = 0; $j < 10; $j++)
        {
        // ...
        }
    }

try {
    // ...
}
catch() {
    // ...
}

正確的:

function foo($bar)
{
    // ...
}

foreach ($arr as $key => $val)
{
    // ...
}

if ($foo == $bar)
{
    // ...
}
else
{
    // ...
}

for ($i = 0; $i < 10; $i++)
{
    for ($j = 0; $j < 10; $j++)
    {
        // ...
    }
}

try
{
    // ...
}
catch()
{
    // ...
}

中括號和小括號內(nèi)的空格

一般情況下,使用中括號和小括號的時(shí)候不應(yīng)該使用多余的空格。 唯一的例外是,在那些接受一個(gè)括號和參數(shù)的 PHP 的控制結(jié)構(gòu)(declare、do-while、elseif、for、 foreach、if、switch、while)的后面應(yīng)該加一個(gè)空格,這樣做可以和函數(shù)區(qū)分開來,并增加可讀性。

錯(cuò)誤的:

$arr[ $foo ] = 'foo';

正確的:

$arr[$foo] = 'foo'; // no spaces around array keys

錯(cuò)誤的:

function foo ( $bar )
{

}

正確的:

function foo($bar) // no spaces around parenthesis in function declarations
{

}

錯(cuò)誤的:

foreach( $query->result() as $row )

正確的:

foreach ($query->result() as $row) // single space following PHP control structures, but not in interior parenthesis

本地化文本

CodeIgniter 的類庫應(yīng)該盡可能的使用相應(yīng)的語言文件。

錯(cuò)誤的:

return "Invalid Selection";

正確的:

return $this->lang->line('invalid_selection');

私有方法和變量

那些只能在內(nèi)部訪問的方法和變量,例如供共有方法使用的那些工具方法或輔助函數(shù),應(yīng)該以下劃線開頭。

public function convert_text()
private function _convert_text()

PHP 錯(cuò)誤

運(yùn)行代碼時(shí)不應(yīng)該出現(xiàn)任何錯(cuò)誤信息,并不是把警告和提示信息關(guān)掉來滿足這一點(diǎn)。 例如,絕不要直接訪問一個(gè)你沒設(shè)置過的變量(例如,$_POST?數(shù)組), 你應(yīng)該先使用?isset()?函數(shù)判斷下。

確保你的開發(fā)環(huán)境對所有人都開啟了錯(cuò)誤報(bào)告,PHP 環(huán)境的 display_errors 參數(shù)也開啟了, 你可以通過下面的代碼來檢查:

if (ini_get('display_errors') == 1)
{
    exit "Enabled";
}

有些服務(wù)器上?display_errors?參數(shù)可能是禁用的,而且你沒有權(quán)限修改 php.ini 文件, 你可以使用下面的方法來啟用它:

ini_set('display_errors', 1);

注解

使用?ini_set()?函數(shù)在運(yùn)行時(shí)設(shè)置?display_errors?參數(shù)和通過 php.ini 配置文件來設(shè)置是不一樣的,換句話說,當(dāng)出現(xiàn)致命錯(cuò)誤(fatal errors)時(shí),這種方法沒用。

短標(biāo)記

使用 PHP 的完整標(biāo)記,防止服務(wù)器不支持短標(biāo)記(?short_open_tag?)參數(shù)。

錯(cuò)誤的:

<? echo $foo; ?>

<?=$foo?>

正確的:

<?php echo $foo; ?>

注解

PHP 5.4 下?<?=?標(biāo)記是永遠(yuǎn)可用的。

每行只有一條語句

切記不要在同一行內(nèi)寫多條語句。

錯(cuò)誤的:

$foo = 'this'; $bar = 'that'; $bat = str_replace($foo, $bar, $bag);

正確的:

$foo = 'this';
$bar = 'that';
$bat = str_replace($foo, $bar, $bag);

字符串

字符串使用單引號引起來,當(dāng)字符串中有變量時(shí)使用雙引號,并且使用大括號將變量包起來。 另外,當(dāng)字符串中有單引號時(shí),也應(yīng)該使用雙引號,這樣就不用使用轉(zhuǎn)義符。

錯(cuò)誤的:

"My String"                 // no variable parsing, so no use for double quotes
"My string $foo"                // needs braces
'SELECT foo FROM bar WHERE baz = \'bag\''   // ugly

正確的:

'My String'
"My string {$foo}"
"SELECT foo FROM bar WHERE baz = 'bag'"

SQL 查詢

SQL 關(guān)鍵字永遠(yuǎn)使用大寫:SELECT、INSERT、UPDATE、WHERE、AS、JOIN、ON、IN 等。

考慮到易讀性,把長的查詢分成多行,最好是每行只有一個(gè)從句或子從句。

錯(cuò)誤的:

// keywords are lowercase and query is too long for
// a single line (... indicates continuation of line)
$query = $this->db->query("select foo, bar, baz, foofoo, foobar as raboof, foobaz from exp_pre_email_addresses
...where foo != 'oof' and baz != 'zab' order by foobaz limit 5, 100");

正確的:

$query = $this->db->query("SELECT foo, bar, baz, foofoo, foobar AS raboof, foobaz
                FROM exp_pre_email_addresses
                WHERE foo != 'oof'
                AND baz != 'zab'
                ORDER BY foobaz
                LIMIT 5, 100");

缺省的函數(shù)參數(shù)

適當(dāng)?shù)臅r(shí)候,提供函數(shù)參數(shù)的缺省值,這有助于防止因錯(cuò)誤的函數(shù)調(diào)用引起的PHP錯(cuò)誤, 另外提供常見的備選值可以節(jié)省幾行代碼。例如:

function foo($bar = '', $baz = FALSE)
以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號