PHP書寫規範 PHP Coding Standard

PHP書寫規範 PHP Coding Standard
 
參考資料:
 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個都行的情況。
 比如tab和4個空格都行,結果導致代碼混亂。
 
通用原則:
 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?函數名以形容詞結尾感覺不合適。待討論。討論結果:getUserBasicInfo合適。
 取用戶詳細信息:暱稱、頭像URI、簽名、生日,函數名getUser沒問題。
 
5、含義模糊的類名、文件名、目錄名
 每當使用common、util、functions、class、object、basic作爲文件名時要慎重,由於這些詞太通用,發展下去裏面東西可 能越來越多,變成垃圾箱。要給這些起一個準確的名字,比如要做字符串處理的類,可以叫StringLib.php,放在lib目錄裏。
 
6、lib、plugin與addon的區別
 有些類、函數算做lib、plugin還是addon。待討論。討論結果:目前增強函數算是Lib,以後再考慮plugin和addon。
 
7、常用詞彙
 優先使用URI,而不是URL。因爲更嚴謹,新的命名開始使用URI。比如js的encodeURI,PHP的$_SERVER['REQUEST_URI']。
 deadline與TTL:deadline表示最後時刻,TTL表示存活時間。比如現在時間是1310449710,TTL是60秒,則deadline是1310449710 + 60 = 1310449770。
 
類名:
 大寫字母開頭,駝峯命名。一般使用名詞,比如配置解析類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.comhttp://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=123。
 
變量:
 全小寫,下劃線分隔,例如:$user_id。
 與Java、C++不一致。討論結果:使用$user_id。
 類的成員變量、函數的形參、類實例化成一個對象,都遵守變量的命名規則。
 原因: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" => "[email protected]",
 )
 支持同行者:
 http://pear.php.net/manual/en/standards.arrays.php
 
數組內部換行:
 2維及以上數組的數組內部換行。
 如
 $user = array(
     'id' => '123',
     'name' => 'user1',
     'email' => '[email protected]',
 );
 1維數組內部不換行。討論結果:1維數組內部不換行。
 如
 $users_id = array('23','12','24');//確定
 
數組最後的逗號:
 數組每一行最後要有逗號,這樣方便以後添加。不過前端JSON最後不能有逗號,否則有的瀏覽器不支持,待討論。討論結果:都行,因爲後端不用考慮IE前端。
 比如
 $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個空格。
 支持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
 set autoindent
 
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:
 HTTP輸出一定要聲明編碼與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。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章