5.3. 删除废除的注释
废除的注释,注释的代码要及时删除
5.4. 常量加注释
对于所有有物理含义的变量、常量,如果其命名不是充分自注释的,在声明时都必须加以注释,说明其物理含义。变量、常量、宏的注释应放在其上方相邻位置或右方。
示例:
[U]复制代码[/U] 代码如下:
// active statistic task number
Define(‘MAX_ACT_TASK_NUMBER',1000)
Define(‘MAX_ACT_TASK_NUMBER',1000); // active statistic task number
5.5. 注释位置
注释应与其描述的代码相近,对代码的注释应放在其上方或右方(对单条语句的注释)相邻位置,不可放在下面,如放于上方则需与其上面的代码用空行隔开。
示例:如下例子不符合规范
例1:
[U]复制代码[/U] 代码如下:
// get replicate sub system index and net indicator
$repssn_ind = $ssn_data[$index]->repssn_index;
$repssn_ni = $ssn_data[$index]->ni;
例2:$repssn_ind = $ssn_data[$index]->repssn_index;
$repssn_ni = $ssn_data[$index]->ni;
// get replicate sub system index and net indicator
应如下书写
// get replicate sub system index and net indicator
$repssn_ind = $ssn_data[$index]->repssn_index;
$repssn_ni = $ssn_data[$index]->ni;
5.6. 数据结构声明加注释
数据结构声明(数组),必须加以注释。对数据结构的注释应放在其上方相邻位置,不可放在下面;对结构中的每个域的注释放在此域的右方。
示例:按如下形式说明
[U]复制代码[/U] 代码如下:
// sccp interface with sccp user primitive message name
$sccp_user_primitive = array(
‘N_UNITDATA_IND' => 1, // sccp notify sccp user unit data come
‘N_NOTICE_IND => 2, // sccp notify user the No.7 network can not transmission this message
N_UNITDATA_REQ => 3 // sccp user's unit data transmission request
)
5.7. 全局变量注释
全局变量要有较详细的注释,包括对其功能、取值范围、哪些函数或过程存取它以及存取时注意事项等的说明。
5.8. 注释缩排
注释与所描述内容进行同样的缩排, 可使程序排版整齐,并方便注释的阅读与理解。
示例:如下例子不符合规范
[U]复制代码[/U] 代码如下:
function example_fun(){
// code one comments
CodeBlock One
// code two comments
CodeBlock Two
}
应改为如下布局:
[U]复制代码[/U] 代码如下:
function example_fun(){
//fdgfd
CodeBlock One
// code two comments
CodeBlock Two
}
5.9. 将注释与其上面的代码用空行隔开
示例:如下例子,显得代码过于紧凑。
[U]复制代码[/U] 代码如下:
// code one comments
program code one
// code two comments
program code two
应如下书写// code one comments
program code one
// code two comments
program code two
5.10. 连续case注释
对于switch语句下的case语句,如果因为特殊情况需要处理完一个case后进入下一个case处理,必须在该case语句处理完、下一个case语句前加上明确的注释。这样比较清楚程序编写者的意图,有效防止无故遗漏break语句。
示例:
[U]复制代码[/U] 代码如下:
switch ($i){
case ‘CMD_INIT':
echo "i equals 0";
break;
case ‘CMD_START:
echo "i equals 1";// now jump into case CMD_A
case ‘CMB_A':
echo "i equals 2";
break;
}
5.11. 结构体声明
代码中代表结构体的数组变量,要提前声明。
示例:
[U]复制代码[/U] 代码如下:
function example_fun(){
$student = array(
'name' => '小明', //名称
'addr' => '详细地址', //地址
'sex' => '男', //性别
'city' => '上海' //城市
)
}
5.12. 注释格式
注释格式统一,单行注释必须使用“// …… ”,多行使用一对/*…*/
示例:如下例子不符合规范。
[U]复制代码[/U] 代码如下:
/* if receive_flag is TRUE */
/* if receive_flag is FALSE */
if ($receive_flag)
应如下书写:
[U]复制代码[/U] 代码如下:
/* if receive_flag is TRUE
if receive_flag is FALSE */
if ($receive_flag)
5.13. 注释以中文为主
注释应考虑程序易读及外观排版的因素,使用的语言若是中、英兼有的,建议多使用中文,除非能用非常流利准确的英文表达。 6. 命名规定 6.1. 禁止拼音命名法
代码中禁止用拼音命名法。
6.2. 变量命名
变量名应当全部小写,并且词语之间以单个下划线分隔。
例如: $current_user 是正确的, 但是 $currentuser 和 $currentUser 就不正确。
名称应当是描述性的,并且简明。我们自然不希望使用冗长的句子作为变量名,但是多输入几个字符总好于疑惑于某个变量到底是干什么用的。
6.3. 函数命名
使用单词间用单下划线分隔的小写名称,允许动宾词组为执行某操作的函数命名。如果是OOP方法,可以只有动词(名词是对象本身)。允许系表函数命名。
示例:
[U]复制代码[/U] 代码如下:
function print_record($rec_ind)
function input_record()
function get_current_color()
function is_boy()
动词表:add / edit / remove begin / end create / destroy
first / last get / release get / set
increment / decrement put / get
lock / unlock open / close
min / max old / new start / stop
next / previous source / target show / hide
send / receive
cut / paste up / down
系词表: is has
对于私有方法,以_开头。
6.4. 循环计数器
允许使用一个单字符变量名的唯一情形是当它作为一个循环计数器的时候。在这种情况下,外层循环的计数器应当始终是 $i。如果有一个循环处于这个循环的内部,它的计数器应当是 $j,进而是 $k,等等。如果循环的计数器是一个已经存在并且名字有意义的变量,本规范并不适用。
例如:
[U]复制代码[/U] 代码如下:
for ($i = 0; $i
6.5. 函数参数
参数遵循和变量名字相同的约定。我们不希望一堆这样的函数:do_stuff($a, $b, $c)。在大部分情况下,我们希望仅仅看看函数的声明,就知道怎样使用它。 7. 可读性 7.1. 运算符的优先级
注意运算符的优先级,并用括号明确表达式的操作顺序,避免使用默认优先级。防止阅读程序时产生误解,防止因默认的优先级与设计思想不符而导致程序出错。
示例:下列语句中的表达式
[U]复制代码[/U] 代码如下:
$word = ($high
(1)(2)不会出错,但语句不易理解;$a | $b
7.2. 避免数字,使用常量
避免使用不易理解的数字,用有意义的常量来替代。
示例:如下的程序可读性差。
[U]复制代码[/U] 代码如下:
if ($trunk[$index]->trunk_state == 0){
$trunk[$index]->trunk_state = 1;
... // program code
}
应改为如下形式。
[U]复制代码[/U] 代码如下:
define(TRUNK_IDLE, 0)
define(TRUNK_BUSY, 1)
if ($trunk[$index]->trunk_state == TRUNK_IDLE){
$trunk[$index]->trunk_state = TRUNK_BUSY;
... // program code
}
8. 函数 8.1. 接口函数参数的合法性检查
函数参数的合法性检查应由函数的调用者负责,接口函数做必要性合法性检查(不强制)。
总结为:以外为主,以内为辅,内部不强制。
8.2. 函数规模
函数的规模限制在100行以内,不包括注释和空格行。
8.3. 一个函数仅完成一件功能
8.4. 不要设计多用途面面俱到的函数
除调度函数外,多功能集于一身的函数,很可能使函数的理解、测试、维护等变得困难
8.5. 多段代码重复同一件事情
如果多段代码重复做同一件事情,那么在函数的划分上可能存在问题。若此段代码各语句之间有实质性关联并且是完成同一件功能的,那么可考虑把此段代码构造成一个新的函数。 9. 质量保证 9.1. 兼容性
9.2. 三元运算符
三元运算符,在一行代码里只允许使用一级
三元运算符只应该用来做简单的事情。它们只适合拿来做赋值用,根本不是用来做函数调用或者任何复杂的事情的。如果使用不当,它们会影响可读性,所以不要沉迷于使用它们来减少打字。
示例:不应该使用它们的地方
(($i $size)) ? do_stuff($foo) : do_stuff($bar);
示例:使用它们的合适地方$min = ($i
9.3. 初始化变量
变量使用前应初始化,error_reporting 将加入 E_NOTICE。意味着,变量未初始化将报错。这个问题最容易在检查 HTML 表单传递了什么变量时出现。这些错误可以通过使用内嵌的 isset() 或者empty()函数检查一个变量是否被设置来避免。
示例: 老办法
if ($forum) ...
新办法:if (!empty($forum)) ...
if (isset($forum)) …
9.4. 引用字符串
在 PHP 中有两种不同的方式引用字符串——使用单引号或使用双引号。主要区别是:解析器在双引号括起的字符串中执行变量替换,却不在单引号括起的字符串中执行。因此,应当始终使用单引号,除非你确实需要对字符串进行变量替换。这样,我们可以避免让解析器解析一堆不需要执行替换的字符串的麻烦。同样,如果你使用字符串变量作为函数调用的一部分,你不需要用引号把那个变量括起来。同样,那只会给解析器增加不必要的工作。无论如何,要注意几乎所有双引号中的转义序列在单引号中都不会起作用。如果这条规范使你的代码难以阅读的话,要小心,并且放心地打破它。
示例:如下例子不符合规范
[U]复制代码[/U] 代码如下:
$str = "This is a really long string with no variables for the parser to find.";
do_stuff("$str");
应如下书写:
[U]复制代码[/U] 代码如下:
$str = 'This is a really long string with no variables for the parser to find.';
do_stuff($str);
当由于可读性的原因不得不使用双引号作为引用符时,注意其中所有的变量需用{}包围:$str = " This is '{$what}' with no variables for the parser to find."
9.5. 关联数组的键名
在 PHP 中,使用一个不用引号括起来的字符串作为一个关联数组的键名是可以运行的。我们不想这样做——为了避免混乱,这个字符串应当用引号括起来。注意,这只是当我们使用字符串时的情况,不是当我们使用变量时的情况。示例:如下例子不符合规范
$foo = $assoc_array[blah];
应如下书写:
$foo = $assoc_array['blah'];
9.6. 简化运算符
简化自增($i++)和自减($i--)运算符是导致可读性问题的仅有的简化运算符。这些运算符不应当被用作表达式的一部分。然而,他们可以独占一行使用。在表达式中使用它们(带来的便利)还不够调试时头痛的(代价)。
示例:如下例子不符合规范
[U]复制代码[/U] 代码如下:
$array[++$i] = $j;
$array[$i++] = $k;
应如下书写:$i++;
$array[$i] = $j;
$array[$i] = $k;
$i++;