PHP書寫規範 PHP Coding Standard

來源:互聯網
上載者:User

簡介:這是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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.