PHP一些規範實例分享

小云云
發布: 2023-03-21 17:18:01
原創
1440 人瀏覽過

本文主要和大家分享PHP一些規範實例。希望能幫助大家。制定規範時要注意:一般不要出現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()
    {

    }
}
登入後複製


檔註解:
註解緊接格式依照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=123。

变量:
全小写,下划线分隔,例如:$user_id。
与Java、C++不一致。讨论结果:使用$user_id。
类的成员变量、函数的形参、类实例化成一个对象,都遵守变量的命名规则。
原因:URI、数据库有小写惯例,从$_GET、$_POST中获得参数入库,所以用小写。
PHP内置变量$_GET、$_POST使用下划线开头,全大写。自定义的变量无论多么重要,都不要使用下划线开头,以免将来与内置变量冲突。
比如:不要使用$_PUT、$_DELETE。

常量:
全大写,下划线分隔。例如:const MEMCACHE_TTL = 600;

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(
    &#39;id&#39; => &#39;123&#39;,
    &#39;name&#39; => &#39;user1&#39;,
    &#39;email&#39; => &#39;a@example.com&#39;,
);
登入後複製

1维数组内部不换行。讨论结果:1维数组内部不换行。
如:

$users_id = array(&#39;23&#39;,&#39;12&#39;,&#39;24&#39;);//确定
登入後複製


数组最后的逗号:
数组每一行最后要有逗号,这样方便以后添加。不过前端JSON最后不能有逗号,否则有的浏览器不支持,待讨论。讨论结果:都行,因为后端不用考虑IE前端。
比如

$user = array(
    &#39;id&#39; => &#39;123&#39;,
    &#39;name&#39; => &#39;user1&#39;, //都行,优点:大数组,经常添加一行,方便。如果没有逗号,确实太难以添加了。
);
$user = array(
    &#39;id&#39; => &#39;123&#39;,
    &#39;name&#39; => &#39;user1&#39; //都行,优点:严谨,逗号表示分隔,最后一个不需要分隔。
);
登入後複製


单引号与双引号:
优先使用单引号,当需要转义时使用双引号,变量不放在双引号中。这与JSON不同,JSON全是双引号,待讨论。讨论结果:优先使用单引号。
比如:

echo &#39;name is:&#39; . $name . &#39;.&#39; . "\n";
$user = array(
    &#39;id&#39; => &#39;123&#39;,
);
登入後複製


条件判断的大括号:
必须有大括号,即使只有一行。
正确:

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(&#39;Last Modified:Sat, 30 Oct 2010 13:21:21 GMT&#39;);
登入後複製

需要用户登录的页面,禁止缓存。

header(&#39;Cache-Control:max-age=0&#39;);
header(&#39;Cache-Control:private&#39;);
登入後複製


HTTP协议编码与mime:
HTTP输出一定要声明编码与mime。charset与分号之间要有一个空格。小写utf-8还是大写UTF-8,尚未找到文档,待调研。
比如

header(&#39;Content-Type:application/json; charset=UTF-8&#39;);
header(&#39;Content-Type:application/xml; charset=UTF-8&#39;);
header(&#39;Content-Type:application/xhtml+xml; charset=UTF-8&#39;);
header(&#39;Content-Type:text/plain; charset=UTF-8&#39;);
header(&#39;Content-Type:text/html; charset=UTF-8&#39;);
登入後複製


专有名词大小写:
在类、函数、文件名、目录名等各种地方,不特殊对待专有名词,不采用全大写。讨论结果:使用小写。
原因:专有名词难以界定,比如HTML、CSS、CRUD。而且全大写导致与驼峰冲突,比如页面助手类,全大写是HTMLHelper,不如HtmlHelper。
支持不特殊处理:
HTML是专有名词,但mime中就使用Content-Type:text/html,而不是text/HTML。
例子:
采用UserDb.php,而不是UserDB.php。

相关推荐:

php规范解析

以上是PHP一些規範實例分享的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!