PHP编码规范
目录
- 前言
- 第 1 章 排版规则
- 第 2 章 命名规范
- 第 3 章 版式规则
- 第 4 章 编程规范
- 第 5 章 注释规则
前言
所有的代码都要变成可供他人容易阅读的
良好的代码书写习惯 + 良好的注释习惯 + PhpDocumentor = 程序说明书
为了更好的编码,整理了这一份文档,在整理当中也学习巩固了不少知识,也遇到很多感到迷惑的地方,还需要 Exp 的增长才能明白。
因为 PHP 的函数大小写不敏感特性,完全可以在调用库函数的时候使用自己的大小写规则调用而不会遇到任何问题。
另外没有一成不变的规则,也有很多规则没有定义到的地方。很多时候可能需要自己来判断如何书写才能让读者更直观的认识程序,本着能清晰语法,而不是混淆语法的书写原则就好。
第 1 章 排版规则
1.1 缩进
对齐只使用空格键,不使用 TAB 键。 缩进的单位为 4 个空格。
说明: 以免用不同的编辑器阅读程序时,因 TAB 键所设置的空格数目不同而造成程序布局变化。虽然使用空格会增加文件的大小,但在局域网中几乎可以忽略,且在编译或压缩过程中也可被消除掉。
1.2 空格规则
空格应在以下情况时使用:
- 跟在((左括号)后面的关键字应被一个空格隔开。
- 函数名与左括号之间不应该有空格。这能帮助区分关键字和函数调用。
- 所有的二元操作符,除了左括号和左方括号应用空格将其与操作数隔开。
- 一元操作符与其操作数之间不应有空格,除非操作符是个单词,比如 typeof。
- 每个在控制部分,比如 for 语句中的; (分号)后须跟一个空格。
- 每个, (逗号)后应跟一个空格。
1.2.1 逻辑运算符前后必须加空格
正确
$a == $b;
错误
$a==$b;
注: 加一减一运算符不能加空格。
正确
$a++; $a––;
错误
$a ++; $a ––;
1.2.2 多个参数分隔时必须加空格
正确
$g_pro , $g_user , g_show;
get_db_info($host, $user, $passwd);
错误
$g_pro,$g_user,$g_show;
get_db_info($host,$user,$passwd);
1.2.3 语法关键字后必须加空格
if, for , while, switch 等关键字…
例如:
正确
for ($i = 0; $i < 10; $i++)
错误
for($i = 0; $i < 10; $i++ )
1.2.4 字符串和变量连接规则
字符串与变量连接使用’.‘号时,必须在’.‘前后加空格,使用”号自动转义变量时必须在变量前后加”{}”。
正确
$my_name = 'file_' . $var1;
$my_name = "file_{$var1}";
错误
$my_name = 'file_'.$var1;
$my_name = "file_$var1";
1.3 换行
每行一个语句,除非这些语句有很密切的联系,否则每行只写一个语句。 用空行来将逻辑相关的代码块分割开可以提高程序的可读性。相对独立的程序块之间、变量说明之后必须加空行。
示例: 如下例子不符合规范。
if (!valid_ni($ni)){
... // program code
}
$repssn_ind = $ni;
应如下书写
if (!valid_ni($ni)){
... // program code
}
$repssn_ind = $ni;
1.3.1 较长的语句(>80 字符)
要分成多行书写,长表达式要在低优先级操作符处划分新行,操作符放在新行之首,划分出的新行要进行适当的缩进,使排版整齐,语句可读。
示例:
if ((taskno < max_act_task_number)
&& (n7stat_stat_item_valid (stat_item))){
... // program code
}
for (i = 0, j = 0; (i < BufferKeyword[word_index].word_length)
&& (j < NewKeyword.word_length); i++, j++) {
... // program code
}
for (i = 0, j = 0;
(i < first_word_length) && (j < second_word_length);
i++, j++) {
... // program code
}
第 2 章 命名规范
2.1 变量命名
规范使用三种书写方式:
-
Pascal 命名规则 将标识符的每个单词的首字母都大写。 例如:BackColor
-
Camel 命名规则 标识符的首字母小写,而后面连接的单词的首字母都大写。 例如:backColor
-
Linux C 命名规则 变量所有字母都使用小写,使用’_‘作为每个词的分界。变量名必须有一定的意义,并且意义准确。
例如:有一个变量用于保存图书的数目,可以命名为 number_of_book 或者 num_of_book。不建议使用 i,j,n 等,因为它没有意义。也不建议使用 number 或 book,因为意义不准确。
2.1.1 局部变量
所有变量都要预先声明,并注明其意义,在函数的首部定义所有的变量。不要使用一个声明一个;
最好把每个变量的声明语句单独放到一行,并加上注释说明。所有变量按照字母排序。
$current_entry; // 当前选择项
$level; // 缩进程度
$size; // 表格大小
尽量减少全局变量的使用。不要让局部变量覆盖全局变量。
变量所有字母都使用小写,使用’_‘作为每个词的分界。
理由:
通过这一途径,代码中变量的作用域是清晰的。
所有的变量在代码中都看起来不同,容易辨认。
例如:
function HandleError($errorNumber) {
$error = osErr($errorNumber);
$time_of_error = osErr->GetTimeOfError();
$error_processor = osErr->GetErrorProcessor();
}
变量名字应该使用名词或者形容词+名词的方式。如$value,$new_value。
ps:此条有待研究,变量与属性本身分区并不明显,为什么要人为这样大的区别呢。貌似已经出现 3 种变量的写法,是不是会阻碍程序编写呢?
2.1.2 全局变量命名
全局变量使用 g 前缀。例:
global $gLog;
global &$rgLog;
2.1.3 静态变量命名
静态变量使用 s 前缀,如:
$sValue。
2.1.4 引用变量和函数返回引用
引用必须带‘r’前缀
理由:
使得类型不同的变量容易辨认,它可以确定哪个方法返回可更改 对象,哪个方法返回不可更改对象。
如:
$rVar。
function &rStatus() {};
2.1.5 临时变量命名
不要将在循环中频繁使用的临时变量如$i,$j 等用于其它用途。
2.1.6 方法中参数命名
参数的名字使用 Camel 命名方法(首字母小写),在首字符后的所有字都按照类命名规则首字符大写。
参数的名字应该是描述性的,参数的名字应该具有自描述性,也就是说参数的名称可以描述参数在大多数情况下的含义,参数的类型也是可以从参数的名字推断出来的。参数的名字是基于参数的含义而不是参数的类型。
理由:
可以区分方法中的一般变量。
你可以使用与类名相似的名称而不至于产生重名冲突。
例如:
class NameOneTwo {
function StartYourEngines(&$rSomeEngine, &$rAnotherEngine);
}
2.2 命名定义/ 全局常量
全局常量用’_‘分隔每个单词。
理由:
这是命名全局常量的传统。你要注意不要与其它的定义相冲突。
例如:
define("A_GLOBAL_CONSTANT", "Hello world!");
class Test {
var mrStatus;
function DoSomething(&$rStatus) {};
function &rStatus() {};
}
2.3 类命名
用 Pascal 命名规则(只是首字母大写的camel的写法,因为我们需要让类的首字母是大写),尽量谨慎的使用缩写,不要用下划线作类名单词连接符。
在类中,方法放到属性定义前边、公用方法放到专用方法前边。
在为类命名前首先要知道它是什么。如果通过类名的提供的线索,你还是想不起这个类是什么的话,那么你的设计就还做的不够好。
超过三个词组成的混合名是容易造成系统各个实体间的混淆,再看看你的设计,尝试使用(CRC Sessioncard)看看该命名所对应的实体是否有着那么多的功用。
对于派生类的命名应该避免带其父类名的诱惑,一个类的名字只与它自身有关,和它的父类叫什么无关。
有时后缀名是有用的,例如: 如果你的系统使用了代理(agent) 那么就把某个部件命名为“下载代理”,(DownloadAgent)用以真正的传送信息。
类使用英文的大小写来分隔单词,包括首个单词,所有单词的首字母大写,如 PageManager;
一般情况下,一个类对应到一个文件,当一些类关系紧密时,可以存放在一个文件中。存放类的文件采用 classname.class.php 方式命名。所有系统文件名均为小写。
2.3.1 接口命名原则
接口名字在类的原则上加前缀 I。
例如:
IComponent (描述性名词)、ICustomAttributeProvider (名词短语)、IPersistable (形容词)等。
有的类, 必须用字母 I 作为类名前缀,而又不是一个接口。这是可以接受的,因为有的类名就是 I 开头的,
例如:
IdentityStore。这种情况和接口的区别在于其第二个字母是 小写的。
有的时候,定义完一个接口之后,也会定义一个类作为接口的标准实现。该类和该接口应该有类似的名字,唯一的区别就是接口名称前缀为字母 I。
如:
IComponent 和它的标准实现 class Component {}。
2.3.2 Exception 命名原则
异常的命名以“Exception”为后缀。
2.3.3 类库命名
目前命名空间正在越来越广泛的被采用,以避免不同厂商和团体类库间的类名冲突。
当尚未采用命名空间的时候,为了避免类名冲突,一般的做法是在类名前加上独特的前缀,两个字符就可以了,当然多用一些会更好。
例如
John Johnson 的数据结构类库可以用 Jj 做为前缀,如下:
class JjLinkList {
}
另一种折中方式是建立包含类库目录(事实上 Java 也是这么做的),以不通的目录代表不同的命名空间。
例如:
Microsoft 的数据库相关类库可以在:
/classes/com/Microsoft/Database/DbConn.php
Apache 的数据库相关类库可在:
/classes/org/apache/Database/DbConn.php
2.3.4 方法命名
采用camel 首字母小写getManagerName(){}
理由:
使用所有不同规则的大部分人发现这是最好的折衷办法。
这里区分下类中的方法和普通的函数:
方法我们采用camel首字母小写的写法(如:doIt()),函数我们建议和php内库函数一致使用下划线(如:do_it())
例如:
class NameOneTwo {
Public function doIt() {};
Public function handleError() {};
}
2.3.5 方法/函数命名修饰
通常每个方法和函数都是执行一个动作的,所以对它们的命名应该清楚的说明它们是做什么的: 用checkForErrors()代替 errorCheck(),用 dumpDataToFile()代替 dataFile()。这么做也可以使功能和数据成为更可区分的物体。
有时后缀名是有用的:
Max - 含义为某实体所能赋予的最大值。
Count - 一个运行中的计数变量的当前值。
Key - 键值。
例如: RetryMax 表示最多重试次数,RetryCount 表示当前重试次数。
有时前缀名是有用的:
is - 含义为问一个关于某样事物的问题。无论何时,当人们看到 Is 就会知道这是一个问题。
get - 含义为取得一个数值。
set - 含义为设定一个数值
r - 小 r 前缀用于修饰返回引用的地方法与函数。
例如:
$isHitRetryLimit。
Public function &rStatus() {};
function doSomething(&$rStatus) {};
方法使用英文的大小写来分隔单词,命名建议使用动词+名词的方式,单词的首字母大写。
不要采用不常用的缩写,如 where2Go();
使用常用的缩写时,只大写首字母,如 getHtml()。
2.3.6 类属性命名
使用英文名词、动词,以大写字母作为词的分隔,其他的字母均使用小写,单词的首个字母使用小写,不使用下划线,对于类属性为某个对象变量,则以字符串 Object 为后缀,例:
class UserAccount {
$tableName = '';
$databaseObject = '';
}
2.3.7 私有属性与私有方法命名
以 _ 开头,如 private $_privateValue;
private static $_sPrivateStaticValue;
private function _initialize(){...};
2.3.8 对象命名
使用类名称为变量前缀,所有字母都使用大写,以字符串Object 为后缀,
例:
$inputObject = new Input();
ps:经测试发现如果遇到比较长的类名的话精简变量名字是有必要的,前提是一眼就能看出名字的意义, 变量过长的命名感觉导致书写困难,也影响程序可读性。
例:
$frontObject = JdFrontController::getInstance();
2.4 缩写词不要全部使用大写字母
无论如何,当遇到以下情况,你可以用首字母大写其余字母小写来代替全部使用大写字母的方法来表示缩写词。
使用: getHtmlStatistic. 不使用: getHTMLStatistic.
理由:
当命名含有缩略词时,人们似乎有着非常不同的直觉。统一规定是最好,这样一来,命名的含义就完全可以预知了。
举个 networkABCKey 的例子,注意 C 是应该是 ABC 里面的 C 还是 key 里面的 C,这个是很令人费解的。
有些人不在意这些,其他人却很讨厌这样。所以你会在不同的代码里看到不同的规则,使得你不知道怎么去叫它。
例如:
class FluidOz // 不要写成 FluidOZ
class GetHtmlStatistic // 不要写成 GetHTMLStatistic
ps:不过有时也要是情况而定,如 PDO 类库本身全大写,那么 class MyPDO extends PDO{…} 也就说得过去了,如果 PDO 小写有可能起反作用,主要目的在于容易理解,而不是做样子。
2.5 函数命名
函数名字采用 C GNU 的惯例,所有的字母使用小写字母,使用’_‘分割单词。
理由:
这样容易区分类方法?
ps:此条有待研究,函数与方法区分微小,人为扩大区分不会起到反作用么?调用的时候明显的->操作方还不够清晰么?
例如:
function some_bloody_function() { }
完成一组功能的函数放到一个文件中,存放函数的文件采用
name.func.php 命名。
第 3 章 版式规则
3.1 语义分隔
各个函数、方法之间应该采用空行间隔;ps:}结束大括号要有空行
同一个函数中联系紧密的语句之间可以不换行,其他情况需要换行。
3.2 圆括号规则
函数名与括号之间不需要加空格、语法关键字后的括号必须加空格。
正确
for ($i = 0; $i < 10; $i++)
strlen($my_name);
错误
for($i = 0; $i < 10; $i++ )
strlen ($my_name);
3.3 方法/函数
函数名与((左括号)之间不应该有空格。)(右括号)与 开始程序体的{(左大括号)之间应插入一个空格。
函数程序体应缩进四个空格。}(右大括号)与声明函数的那一行代码头部对齐。
function outer($c, $d) {
$e = $c * $d;
function inner($a, $b, $e) {
return ($e * $a) + $b;
}
return inner(0, 1, $e);
}
如果函数是匿名函数,则在 function 和((左括号)之间应有一个空格。如果省略了空格,否则会让人感觉函数名叫作 function。
$a = function ($e) {
return $e;
};
3.4 关键字
if、for、do、while、case、switch、default 等语句自占一行,且 if、for、do、while 等语句的执行语句部分无论多少都要加括号{}。
示例:
如下例子不符合规范:
if (NULL == $rUserCR) return;
应如下书写:
if (NULL == $rUserCR){
return;
}
3.4.1 if 语句
if 语句应如以下格式:
if (condition){
statements;
}
if (condition) {
statements;
} else {
statements;
}
if (condition) {
statements;
} else if (condition) {
statements;
} else {
statements;
}
3.4.2 for 语句
for 语句应如以下格式:
for (initialization;condition; update) {
statements;
}
3.4.3 while 语句
while 语句应如以下格式:
while (condition){
statements;
}
3.4.4 do 语句
do 语句应如以下格式:
do {
statements;
} while (condition);
不像别的复合语句,do 语句总是以;(分号)结尾。
3.4.5 switch 语句
switch 语句应如以下格式: switch (expression){ case expression: statements; default: statements; }
每个 case 与 switch 对齐。这可避免过分缩进。
每一组 statements(除了 default 应以 break,return,或者 throw 结尾。不要让它顺次往下执行。
3.4.6 try 语句
try 语句应如以下格式:
try {
statements;
} catch (variable){
statements;
}
3.4.7 return 语句
一条有返回值的 return 语句不要使用( )(括号)来括住返回值。如果返回表达式,则表达式应与 return 关键字在同一行,以避免误加分号错误。
第 4 章 编程规范
系统统一使用时间戳 time()作为时间标志,写入 mysql 时使用 INT(10)类型写入,读取时可以使用公共函数库中的 getdate()将时间戳转换为标准时间格式;
引号统一使用’单引号,只有当引号重叠时才使用"双引号,这样每进程可以节省几百 K 内存;
统一使用,禁止使用 ?>格式。
4.1 数组定义规则
数组定义和使用时中 key 值前后必须加单引号。 //正确
array(
'name' => 'd5s.cn',
'gender' => 'php'
);
//错误 array( Name => ‘d5s.cn’, gender => ‘php’ );
4.2 不要采用缺省方法测试非零值
不要采用缺省值测试非零值,也就是使用:
if (FAIL != f())
比下面的方法好:
if (f())
即使 FAIL 可以含有 0 值 ,也就是 PHP 认为 false 的表示。在某人决定用-1 代替 0 作为失败返回值的时候,一个显式的测试就可以帮助你了。就算是比较值不会变化也应该使用显式的比较;
例如:
if (!($bufsize % strlen($str)))
应该写成:
if (($bufsize % strlen($str)) == 0)
以表示测试的数值(不是布尔)型。
一个经常出问题的地方就是使用 strcmp 来测试一个字符等式,结果永远也不会等于缺省值。非零测试采用基于缺省值的做法,那么其他函数或表达式就会受到以下的限制:
只能返回 0 表示失败,不能为/有其他的值。
命名以便让一个真(true)的返回值是绝对显然的,调用函数 IsValid()而不是 Checkvalid()。
Ps:最直接的体现就是 PHP 的 ip2long 函数,在 5.2.10 以前他返回-1 表示出错,之后他返回 false 表示出错.
4.3 通常避免嵌入式的赋值
有时候在某些地方我们可以看到嵌入式赋值的语句,那些结构不是一个少冗余,可读性强的好方法。
while ($a != ($c = getchar())) {
process the character
}
++和–操作符类似于赋值语句。因此,出于许多的目的,在使用函数的时候会产生副作用。使用嵌入式赋值提高运行时性能是可能的。
无论怎样,程序员在使用嵌入式赋值语句时需要考虑在增长的速度和减少的可维护性两者间加以权衡。
例如:
$a = $b+$c;
$d = $a+$r;
不要写成:
$d = ($a = $b+$c)+$r;
虽然后者可以节省一个周期。但在长远来看,随着程序的维护费用渐渐增长,程序的编写者对代码渐渐遗忘,就会减少在成熟期的最优化所得。
4.4 布尔逻辑类型
大部分函数在 FALSE 的时候返回 0,但是返回非 0 值就代表 TRUE,因而不要用 1(TRUE,YES,诸如此类)等式检测一个布尔值,应该用 0(FALSE,NO,诸如此类)的不等式来代替:
if (TRUE == func()) {
应该写成:
if (FALSE != func()) {
4.5 别在对象构造函数中做实际的工作
别在对象架构构造函数中做实际的工作, 构造函数应该包含变量的初始化和(或)不会发生失败的操作。
理由:
构造不能返回错误 。
例如:
class Device {
function device() {
/* initialize and other stuff */
}
function open() {
return FAIL;
}
}
$dev = new Device;
if (FAIL == $dev->open()){
exit(1);
ps:通过例子清晰表明,问题所在就是构造函数不能 return. 所以不需要 return 的错误就没问题…(出错就自动挂掉全部程序 -_-‘ )
4.6 switch 格式
-
当一个 case 块处理后,直接转到下一个 case 块处理,在这个 case 块的最后应该加上注释。
-
default case 总应该存在,它应该不被到达,然而如果到达了就会触发一个错误。
-
如果你要创立一个变量,那就把所有的代码放在块中。
例如
switch (...) {
case 1:
...
// FALL THROUGH
case 2:
{
$v = get_week_number();
...
}
break;
default:
}
4.7 Continue 和 Break
Continue 和 break 其实是变相的隐蔽的 goto 方法。
Continue 和 break 像 goto 一样,它们在代码中是有魔力的,所以要节俭(尽可能少)的使用它们。
使用了这一简单的魔法,由于一些未公开的原因,读者将会被定向到只有上帝才知道的地方去。
Continue 有两个主要的问题:
它可以绕过测试条件。
它可以绕过等/不等表达式。
看看下面的例子,考虑一下问题都在哪儿发生:
while (TRUE) {
...
// A lot of code
...
if (/* some condition */) {
continue;
}
...
// A lot of code
...
if ( $i++ > STOP_VALUE) break;
}
注意: “A lot of code"是必须的,这是为了让程序员们不能那么容易的找出错误。
通过以上的例子,我们可以得出更进一步的规则: continue 和 break 混合使用是引起灾难的正确方法。
ps:刚看还真没发现问题(悲剧),运行后发现问题所在…
4.8 ? :
麻烦在于人们往往试着在 ? 和 : 之间塞满了许多的代码。以下的是一些清晰的连接规则:
把条件放在括号内以使它和其他的代码相分离。
如果可能的话,动作可以用简单的函数。
把所做的动作,“?”“:”放在不同的行,除非他们可以清楚的放在同一行。
例如:
(condition) ? funct1() : func2();
或
(condition)
? long statement
: another long statement;
4.9 其他杂项
PHP 标签统一使用,禁止使用 ?>格式。
使用完毕后的数组变量、对象变量、查询集合必须马上使用 unset()、free_result()释放资源。
PHP 文件中绝不能出现 html 语句,html 文件中尽可能避免出现 PHP 语句。
如果发觉您在程序中的命名只有少量能和其对应事物相匹配的话,请重新设计系统。
在为类命名前首先要知道它是什么。如果通过类名提供的线索,您还是想不起这个类是什么的话,那么您的设计是做得不够好。 超过三个单词组成的混合名是容易造成系统各个实体间的混淆,请重新设计类。
所有文件的名字均为小写,以兼容 win/unix 类系统。
4.9.1 类定义文件中,定义体之外不得出现诸如 echo、print 等输出语句;
理由:
出现这样的语句,应该当做出现 bug 来看。
4.9.2 在 HTML 网页中尽量不要穿插 PHP 代码
循环代码和纯粹变量输出(类似于)除外。
理由:
需要说明的是我们工作的上游,页面设计者的工作,假如在页面中穿插代码,将破坏结构,这应当是我们需要避免的。
在这里的 PHP 代码只负责显示,多余的代码显然是不应该的。
4.9.3 没有含义的数字
一个在源代码中使用了的赤裸裸的数字是不可思议的数字,因为包括作者,在三个月内,没人它的含义。
例如:
if (22 == $foo) { start_thermo_nuclear_war(); }
else if (19 == $foo) { refund_lotso_money(); }
else if (16 == $foo) { infinite_loop(); }
else { cry_cause_im_lost(); }
在上例中 22 和 19 的含义是什么呢?如果一个数字改变了,或者这些数字只是简单的错误,你会怎么想?
使用不可思议的数字是该程序员是业余运动员的重要标志.。
你应该用 define()来给你想表示某样东西的数值一个真正的名字,而不是采用赤裸裸的数字,例如:
define("PRESIDENT_WENT_CRAZY", "22");
define("WE_GOOFED", "19");
define("THEY_DIDNT_PAY", "16");
if (PRESIDENT_WENT_CRAZY == $foo) { start_thermo_nuclear_war(); }
else if (WE_GOOFED == $foo) { refund_lotso_money(); }
else if (THEY_DIDNT_PAY == $foo) { infinite_loop(); }
else { happy_days_i_know_why_im_here(); }
现在不是变得更好了么?
4.9.4 PHP 文件扩展名
常见的 PHP 文件的扩展名有: html, .php, .php3, .php4, .phtml, .inc, .class…
这里我们约定:
- 所有浏览者可见页面使用.html
- 所有类、函数库文件使用.php
理由
扩展名描述的是那种数据是用户将会收到的。PHP 是解释为 HTML 的。
4.9.5 总是将恒量放在等号/不等号的左边,
例如:
if ( 6 == $errorNum ) ...
一个原因是假如你在等式中漏了一个等号,语法检查器会为你报错。
第二个原因是你能立刻找到数值而不是在你的表达式的末端找到它。
需要一点时间来习惯这个格式,但是它确实很有用。
4.10 SQL 规则
在 PHP 中嵌入的 SQL 语句关键字全部采用大写;
表名和字段名要用反引号(`)引起来以防止因为字段名中包含空格而出现错误;
数据值两边用单引号”包括,并且应确保数据值中的单引号已经转义以防止 SQL 注入。
正确
$sql = ”SELECT `user`.`name` FROM `user` WHERE `id` = ’$id’ LIMIT 1″;
错误
$sql = ”select name.user from name where id = $id ”;
能使用多表查询一次查询的数据要一次读完,避免多次查询数据库,数据库使用完要关闭连接;
4.10.1 输出网页的页面不出现 SQL 语句
理由:
这是 n 层结构的编程思想所致,每层的任务不同,虽然可以越权行使,可能这样很快捷,但我们不赞成这么干。
4.10.2 进行 SQL 执行的数据必须进行有效性检测
特殊符号:
对于 MS SQL Server,’%_[ ] 这些符号都是在书写 SQL 语句中的特殊含义字符,在 SQL 执行前需要对这些字符进行处理。
脚本符号:
对于 PHP 脚本标记,如,在进入数据库前需要检测处理。
理由:
这是数据库编程的一个约定,很多参考书上也是这么说,这里需要强调一下。
第 5 章 注释规则
5.1 一般规则
程序中要保证 20%的注释,边写程序边注释。不要吝啬注释。给以后需要理解你的代码的人们(或许就是你自己)留下信息是非常有用的。注释应该和它们所注释的代码一样是书写良好且清晰明了。偶尔的小幽默就更不错了。记得要避免冗长或者情绪化。
及时地更新注释也很重要。错误的注释会让程序更加难以阅读和理解。
让注释有意义。重点在解释那些不容易立即明白的逻辑上。不要把读者的时间浪费在阅读类似于:
i = 0; //让 i 等于 0
使用单行注释。块注释用于注释正式文档和无用代码。 把注释看成程序的一部分,在编写/维护代码时同时编写/维护注释;
注释完全采用 PHPDocumentor 的规范,以方便用其生成 API 级文档。详细规则请参见 PHPDocumentor 手册。
5.2 方法/函数注释
方法声明时要在开头说明其实现功能、各参数、返回值意义,复杂逻辑要在声明时说明其实现思想,并在关键步骤做出注释; 调用方法时也要指出其目的;
5.3 类注释
类声明时要在头部注明类作用、作者、时间;修改时要注明修改人,修改说明;类头部的注释中要列出所有的属性、方法,并指出其意义;
5.4 记录所有的空语句
总是记录下 for 或者是 while 的空块语句,以便清楚的知道该段代码是漏掉了,还是故意不写的。
while ($dest++ = $src++)
; // VOID
5.5 用 if (0)来注释外部代码块
有时需要注释大段的测试代码,最简单的方法就是使用 if (0)块:
function example() {
great looking code
if (0) {
lots of code
}
more code
}
你不能使用/**/,因为注释内部不能包含注释,而大段的程序中可以包含注释。
5.6 版权信息
// +—————————————————-+
// | phpDocumentor |
// +—————————————————-+
// | Copyright (c) 2000-2003 jm|
// | Email jm@phpdoc.org |
// | Web http://www.phpdoc.org |
// +—————————————————-+
// | This source file is subject to PHP License |
// +—————————————————-+
备注 使用//来标示版权信息,以免和 PHPDocumentor 的 page-level DocBlock 发生冲突。
以上的编码规范都为了提高团队协作开发、阅读、维护效率,降低成本,不必拘泥于规范,只要合理合适。另外推荐最新的代码整洁之道-php版
@tsingchan