如题,生物界中任何东西都需要成长,而成长却也分为两种,一种是邪恶的成长,一种是健康的成长。
程序员也是一样的,当我们在成长的时候,必须提前知道规范,从而形成健康的成长,否则养成了大的恶习之后,再后悔却是如此的痛苦了。
所以,今天就整理了一下php的规范,让大家参考参考。就像大家常说的一句话,“规矩是死的,人是活的。”。是的,但是,在规矩中成长的人都会拥有一堆非常让人羡慕的好习惯。
php规范1. 为什么要编码规范编码规范(code conventions)对于程序员而言尤为重要,有以下几个原因:2. 概要用四个空格代替tab缩进。去掉php文件底部的“?>”。每行程序一般少于80字符,超出部分,分成多行书写。每行只写一条语句,不允许把多个短语句写在一行中。应为文件和函数添加注释。应及时删除废除的注释代码。变量、函数的命名应规范。3. 编辑器设定3.1. 缩进所有的缩进使用空格取代tab制表符。php文件采用4个空格的缩进,html文件以及html文件中嵌入的javascript代码采用2个空格的缩进;单独的 javascript以及css文件采用4个空格的缩进。
3.2. 字符编码所有php、html文件均保存为no bom utf-8的字符编码。
4. 代码布局4.1. 文件底部去掉文件底部 “?>”。
4.2. 相对独立的程序块之间、变量说明之后必须加空行示例:如下例子不符合规范
if (!$valid_ni()){ ... // program code}$repssn_ind = $ssn_data[’index’]->repssn_index;$repssn_ni = $ssn_data[’index’]->ni;
应如下书写:
if (!valid_ni(){ ... // program code}$repssn_ind = $ssn_data[’index]->repssn_index;$repssn_ni = $ssn_data[index]->ni;
4.3. 较长的语句要分成多行书写一行程序需小于80字符
较长的语句要分成多行书写,长表达式要在低优先级操作符处划分新行,操作符放在新行之首,划分出的新行要进行适当的缩进,使排版整齐,语句可读。
循环、判断等语句中若有较长的表达式或语句,则要进行适应的划分,长表达式要在低优先级操作符处划分新行,操作符放在新行之首示例:
$perm_count_msg->len = no7_to_stat_perm_count_len + stat_size_per_fram * strlen( $len );$act_task_table[$frame_id * stat_task_check_number + $index]->occupied = $stat_poi[index]->occupied;$act_task_table[taskno]->duration_true_or_false = sys_get_sccp_statistic_state( $stat_item );if (($taskno length = 0; $rect->width = 0;
应如下书写:
$rect->length = 0;
$rect->width = 0;
4.5. 始终包含大括号这是因为懒于多敲两个字符而给代码清晰带来问题的又一个情形。
示例:如下例子不符合规范
if ($condition) do_stuff();if ($condition) do_stuff(); while ($condition) do_stuff(); for ($i = 0; $i < $size; $i++) do_stuff($i);
应如下书写
if (condition){ do_stuff();}while ($condition){ do_stuff();}for ($i = 0; $i < $size; $i++){ do_stuff();}
4.6. switch写法示例:如下例子符合规范
switch (){case ‘1’: ..program break;case ‘2’: ..program break;}
4.7. 大括号放在哪儿程序块的分界符(大括号‘{’和‘}’)应各独占一行并且位于同一列,同时与引用它们的语句左对齐。
而在函数体的开始、类的定义、以及if、for、do、while、switch、case语句中的右大括号应放在行尾, 左大括号应与右大括号所在行的行首处在同一列
示例:如下例子不符合规范
for (...){ ... // program code}if (...){ ... // program code}function example_fun(){ ... // program code}
应如下书写:
for (...){ ... // program code}if (...){ ... // program code}function example_fun(){ ... // program code}
4.8. 符号之间使用空格采用这种松散方式编写代码的目的是使代码更加清晰。
由于留空格所产生的清晰性是相对的,所以,在已经非常清晰的语句中没有必要再留空格,如果语句已足够清晰则括号内侧(即左括号后面和右括号前面)不需要加空格,多重括号间不必加空格。在长语句中,如果需要加的空格非常多,那么应该保持整体清晰,而在局部不加空格。给操作符留空格时不要连续留两个以上空格。
示例:如下例子不符合规范
$i=0;if($i<7) ...if ( ($i 8) ) ...for($i=0; $i<$size; $i++) ...$i=($j < $size)?0:1;do_stuff( $i, foo, $b );
应如下书写:
$i = 0;if ($i < 7) ...if (($i 8)) ...for ($i = 0; $i < $size; $i++) ...$i = ($j 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. 数据结构声明加注释数据结构声明(数组),必须加以注释。对数据结构的注释应放在其上方相邻位置,不可放在下面;对结构中的每个域的注释放在此域的右方。
示例:按如下形式说明
// 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. 注释缩排注释与所描述内容进行同样的缩排, 可使程序排版整齐,并方便注释的阅读与理解。
示例:如下例子不符合规范
function example_fun(){ // code one comments codeblock one // code two comments codeblock two}应改为如下布局:function example_fun(){ //fdgfd codeblock one // code two comments codeblock two}
5.9. 将注释与其上面的代码用空行隔开示例:如下例子,显得代码过于紧凑。
// code one commentsprogram code one// code two commentsprogram code two
应如下书写
// code one commentsprogram code one// code two commentsprogram code two
5.10. 连续case注释对于switch语句下的case语句,如果因为特殊情况需要处理完一个case后进入下一个case处理,必须在该case语句处理完、下一个case语句前加上明确的注释。这样比较清楚程序编写者的意图,有效防止无故遗漏break语句。
示例:
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. 结构体声明代码中代表结构体的数组变量,要提前声明。
示例:
function example_fun(){ $student = array( 'name' => '小明', //名称 'addr' => '详细地址', //地址 'sex' => '男', //性别 'city' => '上海' //城市 )}
5.12. 注释格式注释格式统一,单行注释必须使用“// …… ”,多行使用一对/*…*/
示例:如下例子不符合规范。
/* if receive_flag is true *//* if receive_flag is false */if ($receive_flag)
应如下书写:
/* if receive_flag is trueif receive_flag is false */if ($receive_flag)
5.13. 注释以中文为主注释应考虑程序易读及外观排版的因素,使用的语言若是中、英兼有的,建议多使用中文,除非能用非常流利准确的英文表达。
6. 命名规定6.1. 禁止拼音命名法代码中禁止用拼音命名法。
6.2. 变量命名变量名应当全部小写,并且词语之间以单个下划线分隔。
例如: $current_user 是正确的, 但是 $currentuser 和 $currentuser 就不正确。
名称应当是描述性的,并且简明。我们自然不希望使用冗长的句子作为变量名,但是多输入几个字符总好于疑惑于某个变量到底是干什么用的。
6.3. 函数命名使用单词间用单下划线分隔的小写名称,允许动宾词组为执行某操作的函数命名。如果是oop方法,可以只有动词(名词是对象本身)。允许系表函数命名。
示例:
function print_record($rec_ind) function input_record() function get_current_color() function is_boy()
动词表:
add / edit / remove begin / end create / destroyfirst / last get / release get / setincrement / decrement put / getlock / unlock open / closemin / max old / new start / stopnext / previous source / target show / hidesend / receivecut / paste up / down
系词表:
is has
对于私有方法,以_开头。
6.4. 循环计数器允许使用一个单字符变量名的唯一情形是当它作为一个循环计数器的时候。在这种情况下,外层循环的计数器应当始终是 $i。如果有一个循环处于这个循环的内部,它的计数器应当是 $j,进而是 $k,等等。如果循环的计数器是一个已经存在并且名字有意义的变量,本规范并不适用。
例如:
for ($i = 0; $i < $outer_size; $i++){ for ($j = 0; $j < $inner_size; $j++){ foo($i, $j); } }
6.5. 函数参数参数遵循和变量名字相同的约定。我们不希望一堆这样的函数:do_stuff($a, $b, $c)。在大部分情况下,我们希望仅仅看看函数的声明,就知道怎样使用它。
7. 可读性7.1. 运算符的优先级注意运算符的优先级,并用括号明确表达式的操作顺序,避免使用默认优先级。防止阅读程序时产生误解,防止因默认的优先级与设计思想不符而导致程序出错。
示例:下列语句中的表达式
$word = ($high << 8) | $low (1)if (($a | $b) && ($a & $c)) (2)if (($a | $b) < ($c & $d)) (3)
如果书写为
$high << 8 | $low$a | $b && $a & $c$a | $b < $c & $d
由于
$high << 8 | $low = ($high << 8) | $low,$a | $b && $a & $c = ($a | $b) && ($a & $c),
(1)(2)不会出错,但语句不易理解;
$a | $b trunk_state = 1; ... // program code}
应改为如下形式。
define(trunk_idle, 0)define(trunk_busy, 1)if ($trunk[$index]->trunk_state == trunk_idle){ $trunk[$index]->trunk_state = trunk_busy; ... // program code}
7.3. 源程序中关系较为紧密的代码应尽可能相邻便于程序阅读和查找。
示例:以下代码布局不太合理。
$rect->length = 10;$char_poi = $str;$rect->width = 5;
若按如下形式书写,可能更清晰一些。
$rect->length = 10;$rect->width = 5; // 矩形的长与宽关系较密切,放在一起。$char_poi = $str;
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
正确的写法:
11.4. 条件修饰符在smarty中可以用eq、neq、gt、lt等来分别表示==、!=、>、。
http://www.bkjia.com/phpjc/440185.htmlwww.bkjia.comtruehttp://www.bkjia.com/phpjc/440185.htmltecharticle如题,生物界中任何东西都需要成长,而成长却也分为两种,一种是邪恶的成长,一种是健康的成长。 程序员也是一样的,当我们在成长的...