縮進
縮進使用4個空格,而不是 tab。如果你使用 emacs 編輯 pear 代碼,你應(yīng)該設(shè)置 indent-tabs-mode 為 nil。下面是一個 mode hook 的示例,用于設(shè)置 emacs 符合縮進標準(你必須確保在編輯 php 文件時,這些設(shè)置發(fā)生作用):
(defun php-mode-hook ()
(setq tab-width 4
c-basic-offset 4
c-hanging-comment-ender-p nil
indent-tabs-mode
(not
(and (string-match "http:///(pear//|pear//)/" (buffer-file-name))
(string-match "/.php$" (buffer-file-name))))))
這里是同等效果的 vim 規(guī)則:
set expandtab
set shiftwidth=4
set softtabstop=4
set tabstop=4
--------------------------------------------------------------------------------
控制結(jié)構(gòu)
控制結(jié)構(gòu)包含 if、for、while、switch 等。這里有一個 if 語句的示例和一個 switch 語句的示例:
if 語句的示例:
<?php
if ((condition1) || (condition2)) {
action1;
} elseif ((condition3) && (condition4)) {
action2;
} else {
defaultaction;
}
?>
switch 語句的示例:
<?php
switch (condition) {
case 1:
action1;
break;
case 2:
action2;
break;
default:
defaultaction;
break;
}
?>
控制語句應(yīng)該在控制關(guān)鍵詞和開始的圓括號之間應(yīng)該有一個空格,以此和函數(shù)調(diào)用進行區(qū)別。
強烈建議你總是使用花括號將控制結(jié)構(gòu)各部分標識出來。即使是在技術(shù)上可以不使用花括號的地方。這可以增加代碼的可讀性,同時避免在結(jié)構(gòu)部分增加新行后引入邏輯上的錯誤。
原始代碼:
if (condition)
return true;
else
return false;
修改后的代碼:
if (condition)
do something; // 出現(xiàn)邏輯錯誤
return true;
else
return false;
正確的做法:
if (condition) {
do something;
return true;
} else {
return false;
}
--------------------------------------------------------------------------------
函數(shù)調(diào)用
調(diào)用函數(shù)時,函數(shù)名和開始的括號之間不應(yīng)該有空白字符。參數(shù)和開始及結(jié)束的括號之間不應(yīng)有空格。而除第一個參數(shù)外,其他參數(shù)都應(yīng)該用一個空格分隔。這里有一個示例:
<?php
$var = foo($bar, $baz, $quux);
?>
像上面的示例代碼,賦值運算等號兩邊都應(yīng)該使用一個空格。如果是相關(guān)的賦值運算,應(yīng)該采用下面的形式以提供更好的可讀性:
<?php
$short = foo($bar);
$long_variable = foo($baz);
?>
--------------------------------------------------------------------------------
函數(shù)定義
按照“one true brace”約定聲明函數(shù):
<?php
function foofunction($arg1, $arg2 = '')
{
if (condition) {
statement;
}
return $val;
}
?>
“one true brace”約定就是開始的花括號單獨占一行,而不是跟在其他語句后面。
具有默認值的參數(shù)應(yīng)該位于參數(shù)列表的后面(事實上 php 語言定義也要求如此)。如果適合,函數(shù)應(yīng)該總是返回一個有意義的值。這里有一個稍微長一點的示例:
<?php
function connect(&$dsn, $persistent = false)
{
if (is_array($dsn)) {
$dsninfo = &$dsn;
} else {
$dsninfo = db::parsedsn($dsn);
}
if (!$dsninfo || !$dsninfo['phptype']) {
return $this->raiseerror();
}
return true;
}
?>
--------------------------------------------------------------------------------
注釋
類型(class)的聯(lián)機文檔應(yīng)該符合 phpdoc(類似于 javadoc)的約定。更多關(guān)于 phpdoc 的信息可以訪問 http://www.phpdoc.de/ 獲得。
此外,強烈鼓勵使用非文檔注釋。一般性規(guī)則是對于那些容易忘記作用的代碼添加簡短的介紹性注釋。
推薦使用 c 樣式的注釋(/* */)和標準 c++ 注釋(//),而不應(yīng)該使用 perl/shell 樣式的注釋(#)。
--------------------------------------------------------------------------------
包含代碼
無論在什么地方無條件包含一個類型文件,應(yīng)該使用 require_once()。如果有條件的包含一個類型文件(例如使用工廠方法),應(yīng)該使用 include_once()。使用兩者中的任何一個都能夠確保類型文件只包含一次。它們共享一個文件列表,因此你不需要擔(dān)心混淆他們 —— 一個文件使用 require_once() 包含后不會在 include_once() 中再一次被包含。
備注:include_once() 和 require_once() 是一個聲明,而不是函數(shù)。你不需要使用圓括號將文件名擴起來(不過使用括號也不會出現(xiàn)錯誤)。
--------------------------------------------------------------------------------
php 代碼標記
總是使用 <?php ?> 來界定 php 代碼,而不要使用 <? ?> 速記方式。這是為了符合 pear 一致性所必須的,同時也是在不同操作系統(tǒng)和不同安裝設(shè)置環(huán)境下移植 php 代碼所要求的。
--------------------------------------------------------------------------------
頭注釋塊
pear 發(fā)布的所有源代碼文件頭部都應(yīng)該包含下面的注釋塊:
<?php
/* vim: set expandtab tabstop=4 softtabstop=4 shiftwidth=4: */
// +----------------------------------------------------------------------+
// | php version 4 |
// +----------------------------------------------------------------------+
// | copyright (c) 1997-2002 the php group |
// +----------------------------------------------------------------------+
// | this source file is subject to version 2.0 of the php license, |
// | that is bundled with this package in the file license, and is |
// | available at through the world-wide-web at |
// | http://www.php.net/license/2_02.txt. |
// | if you did not receive a copy of the php license and are unable to |
// | obtain it through the world-wide-web, please send a note to |
// | [email protected] so we can mail you a copy immediately. |
// +----------------------------------------------------------------------+
// | authors: original author <[email protected]> |
// | your name <[email protected]> |
// +----------------------------------------------------------------------+
//
// $ id $
?>
這里沒有硬性規(guī)定要將一個代碼貢獻者的名字添加到文件注釋的作者列表中。一般情況下,他們的更改屬于“substantial”目錄(意味大約10%到20%的代碼被改寫)。有一個例外就是代碼貢獻者重寫了函數(shù)或者貢獻了新的程序邏輯。
簡單的代碼重組和 bug 修復(fù)不應(yīng)該增加新作者,這是不恰當(dāng)?shù)摹?/p>
不在核心 pear 倉庫中的文件應(yīng)該有一個類似的注釋塊來說明版權(quán)、許可協(xié)議和作者。所有文件應(yīng)該包含一個模式行(modeline,用于 vim 和 emacs)以確保一致性。
--------------------------------------------------------------------------------
使用 cvs
這個小節(jié)的內(nèi)容僅僅適用于 cvs.php.net 上使用 cvs 的包。
在每一個文件中包含 $id $(兩個 $ 符號之間的關(guān)鍵字不能夠有空格,但由于此文檔也是用 cvs 管理,因此只好加個空格,避免被 cvs 替換掉) cvs 關(guān)鍵字,以便查看文件當(dāng)前狀態(tài)和最后修改時間等信息。如果已經(jīng)存在“l(fā)ast modified:”這樣的信息,則替換為 $id $ 標記。
這個小節(jié)的其他內(nèi)容假定你有關(guān)于 cvs 標記和分支(branches)的基本知識。
cvs 標記用于標識你包中的文件釋放之前所作的修訂。下面的列表是必需使用和建議使用的 cvs 標記:
release_n_n
(必需的)用于標記一個釋放版本。如果你沒有使用這個標記,別人就沒有辦法在你發(fā)布一個釋放版本時從 cvs 服務(wù)器獲取你的包。
qa_n_n
(分支,可選)如果你覺得在發(fā)布釋放版本之前要提供一個候選釋放版本,那么一個好主意就是增加一個分支。這個分支可以讓你將釋放版本隔離出來,并在正式發(fā)布釋放版本之前可以為這些分支單獨應(yīng)用更新。期間,正常的開發(fā)工作可以在主干上繼續(xù)進行。
maint_n_n
(分支,可選)如果你需要創(chuàng)建一個較小修改的釋放版本(例如在 1.2 之后發(fā)布 1.2.1)。那么你可以創(chuàng)建一個分支來達到目的。
僅有 release 標記是必須的,其他標記為了方便推薦你使用。
下面是一個如何為 "money_fast" 包 1.2 釋放版本增加標記的示例:
$ cd pear/money_fast
$ cvs tag release_1_2
t fast.php
t readme
t package.xml
經(jīng)過上面的操作,就可以在 pear web 網(wǎng)站上獲取你的一系列釋放版本了。
這里是一個如何建立 qa 分支的示例:
$ cvs tag qa_2_0_bp
...
$ cvs rtag -b -r qa_2_0_bp qa_2_0
$ cvs update -r qa_2_0
$ cvs tag release_2_0rc1
...and then the actual release, from the same branch:
$ cvs tag release_2_0
"qa_2_0_bp" 標記是一個 "branch point" 標記,用于標記分支的開始。總是用這樣的標記來標明分支的開始是一個好主意。maint 分支可以使用 release 標記作為它的分支起點。
--------------------------------------------------------------------------------
示例中的 url
所有示例中用到的 url 地址都應(yīng)該是 "example.com"、"example.org"、"example.net"。
--------------------------------------------------------------------------------
命名約定
一般而言,class、函數(shù)和變量的名字應(yīng)該總是能夠描述讓代碼閱讀者能夠容易的知道這些代碼的作用。
classes
class 應(yīng)該具有一個描述性的名字。可能時應(yīng)該避免使用縮寫。class 名字應(yīng)該總是用一個大寫字母開始。從 class 名字中也能夠反映出 pear class 的層次。層次中的每個級別都用下劃線進行分隔。好的 class 名字示例如下:
log
net_finger
html_upload_error
函數(shù)和方法
函數(shù)和方法應(yīng)該使用 "studly caps" 樣式命名。函數(shù)應(yīng)該將所在包的名字作為前綴,以避免與其他包的函數(shù)發(fā)生名字沖突。名字的受字母(前綴之后)應(yīng)該是小寫,每一個新單詞應(yīng)該以大寫字母開頭。下面是一些示例:
connect()
getdata()
buildsomewidget()
xml_rpc_serializedata()
私有 class 成員和屬性(意味著 class 成員和屬性只應(yīng)該由同一個 class 中聲明的成員使用。不過 php 并不支持強制性的私有命名空間)應(yīng)該用一個下劃線開頭。示例:
_sort()
_inittree()
$this->_status
常數(shù)
常數(shù)應(yīng)該總是全部使用大寫字母命名,用下劃線來分隔單詞。常數(shù)名字的前綴應(yīng)該使用大寫的 class/包 名字。例如:db:: 包使用的所有常數(shù)都已 db_ 開頭。
全局變量
如果你的包需要定義全局變量,那么應(yīng)該用下劃線跟上包的名字和另一個下劃線作為開頭。例如,pear 包使用一個全局變量名為 $_pear_destructor_object_list。
預(yù)定義的值 true、false 和 null
php 的內(nèi)建值 true、false 和 null 必須全部用小寫字母書寫。
新聞熱點
疑難解答