記得以前寫過一個php編碼規範的文章,這裡的格式是zf的規範,大部分可以應用於非zf項目的PHP。
說實話在程式正確的情況下,我有部分沒有遵守。
PHP檔案格式
1.?>
?>這個如果是結尾,在PHP中不是必須寫的。不寫的目的是為了防止出現?>之後出現空格造成檔案有輸出。有輸出也許就會出現session already send之類的錯誤。盡量讓?>後面沒有輸出,有了zf,代碼和頁面混合編碼已經是上上上個世紀的事情了,所以你的程式要是有了?>後面出現 別的,那看來還要繼續啃手冊了,啃啃view和controller做為預習。
2.縮排
4個空格,這個已經成為軟體業標準了。
3.行最大長度
建議是每行最多是80個字元,最多不超過120個。出螢幕了還需要拉橫向捲軸,所以盡量多加換行。習慣問題,有人就是寬屏,160個字都夠。
4.分行符號
zf手冊建議是使用unix like的換行,不要使用mac和windows的換行
就是用\n ,不用\r或者\r\n
這個沒發現有什麼必要,能省一個符號?還是php主要跑在unix like上?恩
命名方式
1.類
zf的類名字這樣的:
這個我解釋不太清楚,如果能看手冊的盡量看手冊。
我只舉幾個例子做下簡單的解釋:
zf的類都寫在Zend/目錄下
Zend/Db/Table.php 這個檔案裡面的類就是 Zend_Db_Table
同樣:Zend/Feed/Rss.php 這個檔案裡面的類就是Zend_Feed_Rss
注意類名和檔案路徑和檔案名稱都是匹配的,還要注意是每個單詞首字母要大寫。
注意:自己寫的類不要使用Zend_開頭。
2.介面
這個和類基本相同
只是多了一點,就是必須以_Interface結尾,所以看到檔案名稱為Interface的就是介面了。
例如:Zend_Controller_Dispatcher_Interface
3.檔案名稱
除了以上類型外,其他的檔案名稱可以使用以字母和底線開頭的字母數字底線橫線("-"),禁止使用空格。
所有的php代碼檔案必須是.php結尾。
例如:Zend/Controller/Front.php
例如:Zend/View/Helper/FormRadio.php
4.函數和方法
函數(function)只能用以字母開頭的字母數字。
zf建議所有的function都放到class中。
函數名必須是小寫字母開頭,如果是多個單片語成,其餘單詞必須是大寫字母。(camelCaps)
例如:getDate(),getElementById()
在物件導向中,成員變數的訪問需要使用set/get,這個設計模式有提到。
例如:private $_myz; public function setMyz(){}; public function getMyz(){};
5.變數
變數只能用以字母開頭的字母數字。
private和protected類型的變數必須以底線開頭,而且是單底線。
public類型的變數不能以底線開頭。
變數名必須是小寫字母開頭,如果是多個單片語成,其餘單詞必須是大寫字母。(camelCaps)
6.常量
常量要以大寫字母開頭,並且全部由大寫字母和底線組成。不帶$符號。
例如:PHP_SELF
常量應該在類中定義:const MYZ_SELF
編碼風格
1.<?php ?>
zf裡面不建議使用短標籤:<??>。我也不建議...
另外一點就是:結尾不寫?>,理由上面解釋過。
2.String
字串如果是純字元(不帶變數),那麼就用單引號。
$myz = 'MyZ is cowboy!';
在字串中需要使用引號的,那麼就用雙引號,裡面使用單引號,在SQL語句中用的很多。
$myz = "SELECT * FROM myFavorites WHERE name = 'frame' LIMIT 0,1";
字串中含有變數,使用雙引號。
$myz = "$name is cowboy!"; $myz = "{$name} is cowboy!";
這個是錯的:$myz = "${name} is cowboy!";(雖然這個在PHP中是正確的)。
字串相連
$zf = 'zend ' . 'framework';
如果需要換行就以下面的格式寫:
$zf = 'zend'
. 'framework'
. 'is'
. 'good';
3.數組
數字索引,索引從0開始。
$myz = array(1,2,3,'myz','great',$a);
字串索引,索引名稱自行定義。
$myz = array ('zend' => '1.0.1',
'php' => '5.1.2',
'apache' => '2.2.4');
4.類
4.1.類的聲明
類後面的{}每半個大擴號,需要單獨佔一行。
每個類需要有符合PHPDocumentor標準的注釋。
類內所有的代碼都要先縮排4個字元。
一個PHP檔案內只能有一個類。
盡量一個PHP檔案不要寫其他的代碼,如果有的話,請空兩行。
例如:
require_once 'Zend/Pdf/Resource/Image/Jpeg.php';
/**
* Documentation Block Here
*/
class SampleClass
{
// entire content of class
// must be indented four spaces
}
4.2.類的成員變數
成員變數要先於函數,在類中定義。
不要使用var 這種方式定義變數,要使用private,protected,public,盡量不要把成員變數定義成public,而是使用set/get方式訪問。
5.函數和方法
5.1.函數和方法的聲明
類中的函數必須使用private,protected,public。
和類的格式相同,也需要大擴號單獨佔一行。
函數後面的()緊貼函數名。
/**
* Documentation Block Here
*/
class Foo
{
/**
* Documentation Block Here
*/
public function bar()
{
// entire content of function
// must be indented four spaces
}
}
函數後面的參數也可以使用引用變數public function bar(&$bar),這個必須先定義成&才能用。
return($this->bar);//這個是錯誤的。要寫成:return $this->bar; 提高可讀性。
5.2.函數和方法的使用
函數參數中如果有多個,就要用逗號隔開,並且逗號後面要有空格。
bar($a, $b, $c);
6.控制語句
6.1.If/Else/Elseif
If,Else,Elseif 每個都要佔一行。
條件中,操作符前後要有空格,提高可讀性。
開始的大括弧和if同行,結束的大括弧另起一行。
例如:
if ($a != 2) {
$a = 2;
} elseif ($a == 3) {
$a = 4;
} else {
$a = 7;
}
盡量多的使用elseif而不是再寫一個if。
在某些時刻也可以不使用{}。例如只有一行。
6.2.Switch
和if相似,開始的大括弧和switch同行,結束的大括弧另起一行。
每一個case都要有4個空格縮排。
switch ($numPeople) {
case 1:
break;
case 2:
break;
default:
break;
}
每個case需要有個break,如果想要出於某種特殊目的不寫break的,需要註明:// break intentionally omitted
7.注釋
7.1.所有的注釋都要符合phpdocumentor規範。http://phpdoc.org/
具體的規範,請參考zf檔案中的內容。
7.2.檔案注釋
每個檔案在開始都要有注釋,符合phpdocumentor標準的。
/**
* Short description for file
*
* Long description for file (if any)...
*
* LICENSE: Some license information
*
* @copyright 2005 Zend Technologies
* @license http://www.zend.com/license/3_0.txt PHP License 3.0
* @version CVS: $Id:$
* @link http://dev.zend.com/package/PackageName
* @since File available since Release 1.2.0
*/
7.3.類注釋
/**
* Short description for class
*
* Long description for class (if any)...
*
* @copyright 2005 Zend Technologies
* @license http://www.zend.com/license/3_0.txt PHP License 3.0
* @version Release: @package_version@
* @link http://dev.zend.com/package/PackageName
* @since Class available since Release 1.2.0
* @deprecated Class deprecated in Release 2.0.0
*/
7.4函數注釋
函數注釋需要註明:描述,全部的參數,傳回值。
如果拋出異常,則需要:@throws exceptionclass [description]