1、文件格式
1. 對於只含有 php 代碼的文件,咱們將在文件結尾處忽略掉 "?>" 。這是爲了防止多餘的空格或者其它字符影響到代碼。
例如:
<?php
$foo = 'foo';
2. 縮進應該可以反映出代碼的邏輯結果,儘可能使用四個空格,禁止使用製表符TAB,由於這樣可以保證有跨客戶端編程器軟件的靈活性。
例如:
if (1 == $x) {
$indented_code = 1;
if (1 == $new_line) {
$more_indented_code = 1;
}
}
3. 變量賦值必須保持相等間距和排列。
例如:
$variable = 'demo';
$var = 'demo2';
4. 每行代碼長度應控制在80個字符之內,最長不超過120個字符。由於 linux 讀入文件通常以80列爲單位,就是說若是一行代碼超過80個字符,那麼系統將爲此付出額外操做指令。這個雖然看起來是小問題,可是對於追求完美的程序員來講也是值得注意並遵照的規範。
5. 每行結尾不容許有多餘的空格。
2、命名約定
1. 類文件都是以「.class.php「爲後綴,且類文件名只容許字母,使用駝峯法命名,而且首字母大寫,例如:DbMysql.class.php 。
2. 配置和函數等其餘類庫文件以外的文件通常是分別以「.inc.php「和」.php「爲後綴,且文件名命名使用小寫字母和下劃線的方式,多個單詞之間如下 劃線分隔,例如config.inc.php , common.php,install_function.php 。
3. 確保文件的命名和調用大小寫一致,是因爲在類Unix系統上面,對大小寫是敏感的。
4. 類名和文件名一致(包括上面說的大小寫一致),且類名只容許字母,例如 UserAction類的文件命名是UserAction.class.php, InfoModel類的文件名是InfoModel.class.php 。
5. 控制器類以Action爲後綴,例如 UserAction、InfoAction ,模型類以Model爲後綴,例如UserModel、InfoModel ,其餘類也分別以相應分類爲後綴,例如Service 、Widget。
6. 方法名只容許由字母組成,下劃線是不容許的,首字母要小寫,其後每一個單詞首字母要大寫,即所謂的 「駝峯法命名」 規則,且越詳細越好,應該可以描述清楚該方法的功能,例如switchModel、findPage。
7. 屬性的命名只容許由字母組成,下劃線是不容許的,首字母要小寫,其後每一個單詞首字母要大寫,即所謂的 「駝峯法命名」 規則,例如tablePrefix、tableName 。
8. 對於對象成員的訪問,咱們必須始終使用 「get」 和 「set」 方法。例如:
class Foo
{
protected $_testObj;
public function getTestObj()
{
return $this->_testObj;
}
public function setTestObj($testObj)
{
$this->testObj = $_testObj;
}
}
9. 當類成員方法被聲明爲 private 時,必須分別以雙下劃線 "__"爲開頭;被聲明爲 protected 時,必須分別以單下劃線 "_" 爲開頭;通常狀況下的方法不含下劃線。例如 :
class Foo
{
private function __example()
{
// ...
}
protected function _example()
{
// ...
}
public function example()
{
// ...
}
}
10. 若是咱們須要把一些常用的方法定義爲全局函數,那麼應該把它們以靜態 (static) 的形式定義在類中。例如:
class Think
{
// ...
static public function autoload($classname)
{
// ...
}
}
11. 被聲明爲 private的類成員屬性必須由雙下劃線 "__" 做爲開頭;被聲明爲 protected 的類成員屬性必須由下劃線 "_" 做爲開頭;而聲明爲 public 的成員屬性則在任什麼時候候都不容許含有下劃線。
12. 函數的命名使用小寫字母和下劃線的方式,且越詳細越好,應該可以描述清楚該函數的功能,例如 get_client_ip 。
13. 當方法或函數參數不必定須要被賦值的時候,用 "null" 來代替 "false" 做爲函數參數的默認值,除非該參數是 boolean 值。
14. 變量只容許由小寫字母和下劃線組成,且建議用描述性的變量的命名,越詳細越好,以致於像 $i 或 $n 等等都是不鼓勵使用的。
15. 類中的常量 constant 和全局範圍內常量define,只能由大寫字母和下劃線組成,各個單詞之間如下劃線分割。
16. boolean 值和 null 值都採用小寫。
3、編碼風格
1. php 代碼必須以完整的形式來定界(<?php … ?>),即不要使用php 短標籤(<? … ?>),且保證在關閉標籤後不要有任何空格。
2. 當一個字符串是純文本組成的時候(即不含有變量),則必須老是以單引號(')做爲定界符。例如:
$a = 'Example String';
3. 變量替換中的變量只容許用 $+變量名 的形式。例如:
$greeting = "Hello $name, welcome back!"; // 容許
$greeting = "Hello {$name}, welcome back!"; // 容許
$greeting = "Hello ${name}, welcome back!"; // 不容許
當用點號 "." 鏈接各字符串的時候,字符串與點號間必須用一個空格隔開,且容許把它分割成多行以加強可讀性。在這種狀況下,點號 "." 必須與等於號 "=" 對齊。例如:
$sql = "SELECT `id`, `name` " . " FROM `people` "
. "WHERE `name` = 'Susan' "
. "ORDER BY `name` ASC ";
當用 array 類型符號來構造數組的時候,必須在每一個逗號以後加上一個空格來加強可讀性。例如:$sampleArray = array(1, 2, 3, 'Think', 'SNS');
4. 當使用 array 類型符聲明關聯數組的時候,咱們鼓勵把它分紅多個行,只是咱們必須同時保證每行的鍵與值的對齊,以保持美觀。例如:
$sampleArray = array(
'firstKey' => 'firstValue',
'secondKey' => 'secondValue'
);
5. 大括號的開始必須在類名的下一行頂格。例如:
class Think
{
// ...
}
6. 類中的全部代碼都必須用四個空格來進行縮進。
7. 每一個 php 文件只容許聲明一個類。在類文件裏面寫其它代碼是容許的,但並不鼓勵這樣作。假如真要附加代碼的話,必須用空行來分隔。
8. 任何類變量的聲明都必須放在類頂部,先於任何函數的聲明。
9. 不容許用 var 符號來聲明變量,類成員變量必須以 private,protected 和 public 來聲明。其次,把類成員聲明爲 public 而直接引用雖然是容許的,但一般更好的方法是使用 get 和 set 方法來訪問類成員。
10. 方法必須老是用 private,protected 或者 public 來聲明其做用域。
11. 靜態 static 方法應該聲明其做用域,且不該該再被聲明爲 private 私有,而應該爲 protected 或者public ,若是隻是不想被子類繼承,則應該用 final 聲明它們。
12. 函數或方法的初始大括號應該在函數聲明的下一行頂格。例如:
function get_client_ip()
{
// …
}
13. 在函數或方法名與參數括號之間不容許出現多餘的空格。例如:
function get_client_ip()
{
// …
}
14. 引用只容許定義在函數參數中,實時傳遞引用是禁止的。例如:
// 引用定義在函數參數-容許的
function defineRefInMethod(&$a)
{
$a = 'a';
}
defineRefInMethod($b);
echo $b; // 'a'
// 實時傳遞引用-禁止的
function callTimePassRef($a)
{
$a = 'a';
}
callTimePassRef(&$c);
echo $c; // 'a'
15. 函數或方法返回值不能夠用括號包住,否則會下降可讀性,並且假如之後函數修改成返回引用的話,這將會拋出一個異常。
16. 鼓勵儘可能使用類型提示,特別是在模塊設計中。例如:
class Foo
{
public function foo(SomeInterface $object)
{
}
public function bar(array $options)
{
}
}
17. 函數和方法參數必須用逗號+空格來分隔。
18. 對於參數爲數組的函數,參數中的數組應該分紅多行以加強可讀性。例如:
threeArguments(array(1, 2, 3), 2, 3);
threeArguments(array(1, 2, 3, 'Think',
'SNS', $a, $b, $c,
56.44, $d, 500), 2, 3);
19. 基於"if", "else"和"else if"的條件控制裏,咱們必須用空格間隔開語句和括號,大括號的開始 "{" 必須與條件控制語句位於同一行,結束 "}" 必須老是獨佔一行且頂格,控制流程內容必須用四個空格進行縮進,且不使用"elseif"。
if ($condition) {
// ...
} else if ($_condition) {
// ...
} else {
// ...
}
20. 在條件控制語句的條件括號內,必須用空格將操做符與其它元素隔開。若是遇到很長的邏輯判斷,則鼓勵用內嵌括號來分割各個邏輯。例如:
if (($a != 2) and ($b == 1)) {
$a = $b;
}
21. "switch" 條件控制語句中,必須用空格將待測參數與其它元素分隔開。例如:
switch ($num) {
// …
}
22. "switch" 語句的內容必須以四個空格縮進,"case" 條件控制的內容必須再加四個空格進行縮進。例如:
switch ($indentedSpaces) {
case 2:
echo "錯誤";
break;
case 4:
echo "正確";
break;
default:
break;
}
23. 在 "switch" 語句中應該老是包括 "default" 控制。
24. 有時候咱們須要在 "case" 語境中省略掉 "break" 或 "return" ,這個時候咱們必須爲這些 "case" 語句加上 "// 此處無break" 註釋。例如:
switch ($numPeople) {
case 1: // 此處無break
case 2:
break;
default:
break;
}