簡介:這是PHP書寫規範 PHP Coding Standard的詳細頁面,介紹了和php,有關的知識、技巧、經驗,和一些php源碼等。
class='pingjiaF' frameborder='0' src='http://biancheng.dnbcw.info/pingjia.php?id=340513' scrolling='no'>PHP書寫規範
作者:sink <sink.cup@gmail.com>
最後修改:2011-7-7
參考資料:
PHP Manual
http://www.php.net/manual/zh/language.oop5.basic.php
PEAR Coding Standards
http://pear.php.net/manual/en/standards.php
C++ Coding Standard
http://www.possibility.com/Cpp/CppCodingStandard.html
Google C++ Style Guide
http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml
Code Conventions for the Java
http://www.oracle.com/technetwork/java/codeconvtoc-136057.html
通用原則:
1、語義化
看到名字,就知道意思。
2、通用首碼
is表示是否、get表示讀、set表示寫。is後面優先跟形容詞,而不是名詞,比如是否多語言文字,應使用is_multilingual,而不是is_multilanguage。
3、單數與複數
參考js的函數命名規則:getElementById、getElementsByTagName、getElementsByName。
例如:
取我的多個好友的名字,應使用getFriendsName,而不是getFriendNames或者getFriendName
取一個使用者,是getUser
取多個使用者,是getUsers
4、冗餘尾碼
盡量不使用data、list、info尾碼。
比如,js的命名就很注意,使用getElementsByTagName而不是getElementsInfoByTagName。
應該使用getFriends或者getFriendsUserId,而不是getFriendsList;應該使用getUser,而不使用getUserInfo或者getUserData。
不過有時候很難避免,比如有2個函數,分別是取使用者基本資料,和取使用者詳細資料。
取使用者基本資料:暱稱、頭像URI,函數名getUserBasic還是getUserBasicInfo?函數名以形容詞結尾感覺不合適,待討論。
取使用者詳細資料:暱稱、頭像URI、簽名、生日,函數名getUser沒問題。
5、含義模糊的類名、檔案名稱、目錄名
每當使用common、util、functions、class、object、basic作為檔案名稱時要謹慎,由於這些詞太通用,發展下去裡面東西可能越來越多,變成垃圾箱。要給這些起一個準確的名字,比如要做字串處理的類,可以叫StringLib.php,放在lib目錄裡。
6、lib、plugin與addon的區別
有些類、函數算做lib、plugin還是addon。待討論。
類名:
大寫字母開頭,駝峰命名。一般使用名詞,比如配置解析類ConfigParser,而不是ParseConfig。
與Java、C++一致。
例如:class UserModel
類的檔案名稱:
與類名相同。這與php autoload有關,為了autoload,類名總要很長,待討論。
與Java一致。
例如:class UserModel的檔案名稱為UserModel.php
非類檔案名稱:
全小寫,底線分隔,不得使用空格。比如get_user.php。
目錄名:
全小寫,底線分隔,不得使用空格。比如model、www。
函數名:
小寫字母開頭,駝峰命名,例如:function addBlog()。
與Java、C++一致。
函數表示功能,即動作,所以動詞優先,例如使用editBlog,而不用blogEdit。
PHP內建函數由於曆史原因,有多種風格,do_something,something_do,dosomething,比較新的函數用了doSomething,才與目前主流語言保持一致。
比如:paser_str、json_encode、substr、fetchAll。
曆史原因可能無法改變,但我們能保證新的代碼是嚴謹的,不要讓自己成為曆史原因。
類中的函數:
兩個函數中間空一行。如果有時間的話,各個函數按英文字母排序,免得太混亂。
例如:
class BlogModel
{
public function addBlog()
{
}
public function updateBlog()
{
}
}
檔案注釋:
注釋緊跟<?php下一行。註明作者。@version暫不需要寫,因為svn提供了版本管理。
格式按照PHPdoc的要求:http://manual.phpdoc.org/HTMLframesConverter/default/phpDocumentor/tutorial_tags.author.pkg.html
<?php
/**
* blog的各種業務:添加、更新
* @author sink
*
*/
class BlogModel
{
}
?>
API注釋:
一定要寫輸入參數,和輸出格式。寫清楚正確時輸出什麼,錯誤時輸出什麼。
否則別人無法使用。
函數注釋:
一定要寫輸出格式。寫清楚正確時輸出什麼,錯誤時輸出什麼。
如果輸入參數比較複雜,包含數組,看參數無法一目瞭然,則要寫輸入參數的注釋。
文檔注釋與函數之間不能有空行。
如果函數內部步驟比較複雜,需要寫“行內注釋”。
例如:
/**
* 更新blog
* @param int $id blog_id
* @param array $data array(
"content" => "", //內容
"tags" => "", //標籤
"update_time" => "", //更新時間
)
* @return bool
*/
public function updateBlog($id,$data)
{
step1 //第一步:asdf
step2 //第二步:qwer
}
URI:
根據rfc1034國際標準的規定,網域名稱中禁止出現底線“_”,網域名稱不區分大小寫。
比如http://dl_dir.qq.com/是錯誤網域名稱。
http://example.com與http://EXAMPLE.COM相同。
所以優先在URI中使用全小寫,GET的name小寫,但是GET的值除外。
比如
http://www.google.com/?hl=zh-CN
http://www.google.com/?hl=zh-cn
URI中非參數的專有名詞的縮寫是否使用小寫,有爭議無定論。
比如
http://fedoraproject.org/zh_CN/
http://zh.wikipedia.org/zh-cn/
http://code.google.com/intl/zh-CN/
http://www.microsoft.com/en-us/
語言文字代碼是專有名詞,ISO規定必須是減號,且建議地區使用大寫。
fedora的用法很奇怪,使用了自己製造的zh_CN,而不是zh-CN。而且不建議在URI中使用底線。
wiki用了小寫,google用了大寫,微軟用了小寫。
優先在URI中使用減號“-”,而不是底線,GET的name除外。
比如
http://example.com/1-2-2
http://example.com/?user_id=123
如果希望使用者手動輸入URI,則不要區分大小寫,且優先使用小寫,因為使用者輸入更方便。
實際情況是:使用者一般是手動輸入欄位名,而不手動輸入URI,因為URI很長。在這種情況下,URI小寫是否有意義,如果使用 http://example.com/?userId=123,變數名就可以使用駝峰$userId = $_GET['userId'],就能夠和Java、C++保持一致,這樣資料庫也要駝峰命名。待討論。
變數:
全小寫,底線分隔,例如:$user_id。
與Java、C++不一致。待討論。
類的成員變數、函數的形參、類執行個體化成一個對象,都遵守變數的命名規則。
原因:URI、資料庫有小寫慣例,從$_GET、$_POST中獲得參數入庫,所以用小寫。
PHP內建變數$_GET、$_POST使用底線開頭,全大寫。自訂的變數無論多麼重要,都不要使用底線開頭,以免將來與內建變數衝突。
比如:不要使用$_PUT、$_DELETE。
常量:
全大寫,底線分隔。例如:const MEMCACHE_TTL = 600;
PHP短標籤:
使用<?php ?>,不使用短標籤<? ?>。因為與xml衝突,且不利於部署。
類大括弧換行:
可以採用大括弧單獨佔一行,也可以大括弧與別的放在一行,有爭議無定論,待討論。
class UserModel
{
}
支援換行者:
http://www.php.net/manual/zh/language.oop5.basic.php
http://pear.php.net/manual/en/standards.classdef.php
函數大括弧換行:
有爭議無定論,待討論。
function getUser()
{
}
支援換行者:
http://www.php.net/manual/zh/language.oop5.basic.php
http://pear.php.net/manual/en/standards.funcdef.php
if大括弧換行:
有爭議無定論,待討論。
例如:
if(!empty($name))
{
}
或者
if(!empty($name)){
}
支援換行者:
http://www.possibility.com/Cpp/CppCodingStandard.html#brace
支援同行者:
http://www.php.net/manual/zh/language.oop5.basic.php
http://pear.php.net/manual/en/standards.control.php
switch大括弧換行:
switch (...)
{
case 1:
...
break;
default:
}
支援換行者:
http://www.possibility.com/Cpp/CppCodingStandard.html#switch
數組小括弧換行:
有爭議無定論,待討論。
$user = array(
"id" => "123",
"name" => "user1",
"email" => "a@example.com",
)
支援同行者:
http://pear.php.net/manual/en/standards.arrays.php
數組內部換行:
2維及以上數組的數組內部換行。
如
$user = array(
'id' => '123',
'name' => 'user1',
'email' => 'a@example.com',
);
1維數組內部不換行?待討論。
如
$users_id = array('23','12','24');
數組最後的逗號:
數組每一行最後要有逗號,這樣方便以後添加。不過前端JSON最後不能有逗號,否則有的瀏覽器不支援,待討論。
比如
$user = array(
'id' => '123',
'name' => 'user1', //正確
);
$user = array(
'id' => '123',
'name' => 'user1' //錯誤
);
單引號與雙引號:
優先使用單引號,當需要轉義時使用雙引號。這與JSON不同,JSON全是雙引號,待討論。
比如:
echo 'name is:' . $name . '.' . "\n";
$user = array(
'id' => '123',
);
條件判斷的大括弧:
必須有大括弧,即使只有一行。
正確:
if(!empty($name))
{
doSomething();
}
錯誤:
if(!empty($name))
doSomething();
斷行符號換行:
使用換行LF(\n,0a,Unix風格)。不使用CR+LF(Windows風格)。
參考:http://zh.wikipedia.org/zh-cn/%E6%8F%9B%E8%A1%8C
eclipse——》workspace——》New text file line delimiter——》Other:Unix
編碼:
使用UTF-8 no BOM。不得使用Windows記事本進行儲存,因為記事本是UTF-8 BOM CR+LF。
eclipse——》workspace——》Text file encoding——》Other:UTF-8
縮排:
使用4個空格進行縮排,也可以採用tab進行縮排。有爭議無定論,待討論。
支援4個空格者:
http://www.oracle.com/technetwork/java/codeconventions-136091.html#262
支援2個空格者:
http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml#Spaces_vs._Tabs
支援3、4或8個空格者:
http://www.possibility.com/Cpp/CppCodingStandard.html#indent
要保證縮排正確,如果使用4個空格,一定不要出現5個空格或者11個空格。
eclipse——》General——》Editor——》Text Editors——》show whitespace characters
vim ~/.vimrc
set expandtab
set softtabstop=4
set shiftwidth=4
HTTP協議緩衝:
文章使用Last Modified表示最後修改時間,不禁止緩衝。
header('Last Modified:Sat, 30 Oct 2010 13:21:21 GMT');
需要使用者登入的頁面,禁止緩衝。
header('Cache-Control:max-age=0');
header('Cache-Control:private');
HTTP協議編碼與mime:
web輸出一定要聲明編碼與mime。charset與分號之間要有一個空格。小寫utf-8還是大寫UTF-8,尚未找到文檔,待調研。
比如
header('Content-Type:application/json; charset=UTF-8');
header('Content-Type:application/xml; charset=UTF-8');
header('Content-Type:application/xhtml+xml; charset=UTF-8');
header('Content-Type:text/plain; charset=UTF-8');
header('Content-Type:text/html; charset=UTF-8');
專有名詞大小寫:
在類、函數、檔案名稱、目錄名等各種地方,不特殊對待專有名詞,不採用全大寫。
原因:專有名詞難以界定,比如HTML、CSS、CRUD。而且全大寫導致與駝峰衝突,比如頁面助手類,全大寫是HTMLHelper,不如HtmlHelper。
支援不特殊處理:
HTML是專有名詞,但mime中就使用Content-Type:text/html,而不是text/HTML。
例子:
採用UserDb.php,而不是UserDB.php。
愛J2EE關注Java邁克爾傑克遜視頻站JSON線上工具
http://biancheng.dnbcw.info/php/340513.html pageNo:7