PHP代码规范.docx
《PHP代码规范.docx》由会员分享,可在线阅读,更多相关《PHP代码规范.docx(29页珍藏版)》请在冰点文库上搜索。
PHP代码规范
一编辑器设置
1.使用Tab缩进,不要使用空格
鉴于很多编辑器在保存文件时会自动清除用于缩进的空格,所以我们一律使用Tab键进行缩进。
2.UNIX文件格式
请将编辑器设置对所有程序使用UNIX格式保存,不要使用Win32或者Mac的格式。
例如,EditPlus里面Document->FileFormat(CR/LF)->Unix。
对于windows格式文件,以Ctrl+M结束(vim下为^M),需要过滤掉:
$text=strtr($text,"\x0D","");
二命名约定
1.公共库名称空间
TPLIB,TencentPHPLibrary
2.常量名
全局常量,用'_'分隔每个单词,使用TPLIB_前缀。
如:
define("TPLIB_TEST_HELLO","Helloworld!
");
类常量,用'_'分隔每个单词,如:
classTPLIB_Package
{
constEXAMPLE_CONST;
}
尽量使用类常量代替全局常量。
3.变量名
局部变量的字母都使用小写,使用“_”作为每个词的分界。
$php_var;
函数、方法的参数,首字母为小写。
functiontest_func($paramName)
类属性,使用骆驼命名法命名,与函数、方法的参数命名方法相同;
全局变量,字母都使用大写,使用“_”作为每个词的分界,公共库中无特殊需求不使用全局变量。
命名必须具有描述性,但务求简练。
不要在变量名中使用长句。
通常在变量名中使用一对词语(使用下划线间隔)对变量进行简要描述这种方式更好。
4.循环索引变量
在循环结构中,仅允许使用一个字母长度的循环索引变量。
通常我们使用$i,如果存在嵌套循环,那么子循环的索引变量应该使用$j,其下级循环的索引变量就是$k,以此类推。
如果循环被原已存在一些有具体含义名称的变量索引,则不受此规定约束。
例如:
for($i=0;$i<$outer_size;$i++)
for($j=0;$j<$inner_size;$j++)
foo($i,$j);
5.类的方法命名
使用骆驼命名法命名,例如getCache()、echoName()。
名字采用“动词+宾语”的形式。
例如write(动词)Cache(宾语)。
6.函数命名
函数应该使用描述性词语命名。
我们不使用C的方式,也不使用类似"stristr()"这种没有描述、令人费解的函数名。
所有函数名必须全部使用英文小写字母,函数名中的单词之间使用下划线间隔。
某些情况下,函数名中更适合使用动词。
print_login_status(),get_user_data(),等等。
一个基本的哲学观点,就是不要仅仅出于懒惰而去破坏代码的清晰。
比如print_login_status_for_a_given_user()太长,换成print_user_login_status()会更好,或者仅仅用print_login_status()。
7.函数自变量
自变量的命名应遵守变量命名规定。
我们不想使用do_stuff($a,$b,$c)中的$a,$b,$c这种缺乏实际表述意义的名称。
多数情况下,我们希望能够仅仅通过查看函数的声明就可以了解如何去使用函数。
8.名称空间与类命名
使用帕斯卡命名方法,如HelloWorld。
由于PHP5.3版本之前没有实现命名空间语法,这给类命名带来了一定的麻烦。
这里使用类名中附带名称空间的命名方法,名称空间与类名间使用下划线连接。
如TPLIB库中Test包的HelloWorld类:
TPLIB_Test_HelloWorld
所有库中的类,都以TPLIB_开头,根据用途命名。
将类名字中的“_”替换为目录分隔符,就是这个类的定义文件所在位置。
这种命名规则和目录结构可以避免命名冲突,根据类名字就能找到文件存放位置。
TPLIB_Test_HelloWorld类在库中的位置为TPLIB/Test/HelloWorld.php
9.文件命名
包含文件应该以.inc.php方式命名,例如config.inc.php。
单独类的文件使用Classname.php方式命名,包中的类使用PackageName/ClassName.php命名。
三代码层
1.使用大括号
在语言结构(if,else,while,switch,for,foreach)中请在陈述与执行的代码分行,执行的代码放到大括号中,大括号不可省略。
/*Theseareallwrong.*/
if(condition)do_stuff();
if(condition)
do_stuff();
while(condition)
for($i=0;$ido_stuff($i);/*Theseareright.*/if(condition){do_stuff();}while(condition){do_stuff();}for($i=0;$i{do_stuff();}2.大括号的位置在语言结构(if,else,while,switch,for,foreach)中和类(class)、函数(function)、方法(method)中,左、右大括号必须单独占一行,与其声明处在相同的缩进级别。例如:/*Theseareallwrong.*/if(condition){while(condition2){...}}else{...}/*Theseareright.*/if(condition){while(condition2){...}}else{...}/*Theseareallwrong.*/for($i=0;$i<$size;$i++){...}/*Theseareright.*/for($i=0;$i<$size;$i++){...}/*Theseareallwrong.*/while(condition){...}/*Theseareright.*/while(condition){...}/*Theseareallwrong.*/switch(condition){case:1...default:...}/*Theseareright.*/switch(condition){case:1...default:...}/*Theseareright.*/functiondo_stuff(){...}/*Theseareright.*/classsome_class{functiona_method(){...}}3.数组格式对于数组的定义,可以使用分行表述每个"key=>value,",每行开头使用一个Tab进行缩进。右括号和该array(的起始行保持对齐。例如:$arr=array('key1'=>'value1','index1'=>'value2',);4.在运算符之间使用空格在比较运算符(>、<、>=、<=、==、===、!=、<>、!==)、赋值运算符(=)、数学运算符(+、-、*、/、%)、位运算符(&、|、^、~、>>、<<)、逻辑运算符(!、&&、||)、冒号(:)、问号(?)、字符串连接运算符(.)、字符串连接赋值运算符(.=)前后,以及左括号(()前(函数调用例外)、逗号(,)后请使用空格进行间隔。例如:/*Theseareallwrong.*/$i=0;/*Theseareallright.*/$i=0;/*Theseareallwrong.*/if($i<7).../*Theseareallright.*/if($i<7).../*Theseareallwrong.*/if(($i<7)&&($j>8)).../*Theseareallright.*/if(($i<7)&&($j>8)).../*Theseareallwrong.*/do_stuff($i,"foo",$b);/*Theseareallright.*/do_stuff($i,"foo",$b);/*Theseareallwrong.*/for($i=0;$i<$size;$i++).../*Theseareallright.*/for($i=0;$i<$size;$i++).../*Theseareallwrong.*/$i=($j<$size)?0:1;/*Theseareallrightg.*/$i=($j<$size) ?0 :1;5.运算符优先级对于容易引起迷惑的表达式中不同运算符的优先级,请使用括号来区分优先级。例如:/*what'stheresult?whoknows.*/$bool=($i<7&&$j>8||$k==4);/*nowyoucanbecertainwhatI'mdoinghere.*/$bool=(($i<7)&&(($j<8)||($k==4)))6.条件语句请在条件陈述中使用&&和||,不要使用and和or。例如:/*Theseareallwrong.*/if(($i<7)and($j>8)).../*Theseareallright.*/if(($i<7)&&($j>8))...多重if...elseif...else最好换用选择结构体(switch...case)。7.语法结构在PHP中echo、exit(die)、return、continue、break、include、include_once、require、require_once等都属于语法结构,大部分语法结构都有两种形式:echo'Thisisastring';echo('Thisisastring');在PHP规定的允许使用的格式下,尽可能使用前一种语法结构的格式,而不要使用函数参数/表达式的形式,仅在参数包含表达式时才需要用括号将其括起来。当返回一个变量时通常不用括号,也建议不要用,这样既可以降低PHP的负担,又可以避免一些错误(见下)。注意:exit(die)只能使用括号结构对于return(),当用引用返回值时永远不要使用括号,只能通过引用返回变量,而不是语句的结果。如果使用return($a);时其实不是返回一个变量,而是表达式($a)的值(当然,此时该值也正是$a的值)。//won'twork,evaluatedasinclude(('vars.php')=='OK'),i.e.include('')if(include('vars.php')=='OK'){ echo'OK';}//worksif((include'vars.php')=='OK'){ echo'OK';}由于echo()是语法结构、没有返回值,所以速度比print()快。在输出多个字符串时,请使用echo的多参数方式(逗号,间隔),会比字符串连接方式(点.间隔)有更好的性能。8.类必须使用PHP5的__construct()和__destruct()方式,禁止使用PHP4的用与类同名函数的方式构造。避免使用魔术方法__get,__set,__autoload。在类里面多加函数不会影响性能。子类的方法比基类执行得更快。执行一个拥有一个参数和空函数体的函数相当于7-8次局部变量自增操作$localvar++,一个相似的方法调用当然就相当于15次局部变量自增操作$localvar++。别在对象构造函数中做实际的工作,构造函数应该包含变量的初始化,但不会发生失败的操作。即构造不能返回错误。例如classDevice{function__construct($param){//这里的代码应该不发生失败}functionopen(){//这里的代码返回失败和成功}}四SQL代码1.SQL代码层SQL关键词语大写(SELECT,INSERT,UPDATE,ALTER,DELETE,CREATE,TABLE,INDEX,COUNT,MAX,MIN,FROM,WHERE,AS,LEFTJOIN,RIGHTJOIN,ON,AND,ORDERBY,DESC,ASC,GROUPBY,LIMIT等等),按照逻辑分行,比如SELECT/INSERT/UPDATE/DELETE在一行,FROM在一行,LEFTJOIN…ON/RIGHTJOIN…ON在一行,WHERE在一行,ORDERBY在一行,GROUPBY在一行,LIMIT在一行。WHERE条件里面多个条件请使用括号来区分优先级。数据表名称请使用名词单数形式,一律使用英文小写字母。如果需要对名称作描述/分类,请在名词前/后加描述/分类关键词语,使用下划线间隔。例如:SELECTfield1ASsomething,field2,field3FROMtablea,tablebWHERE(this=that)AND(this2=that2)2.MySQL的查询性能优化原则(1)请不要在SELECT中使用DISTINCT;(2)尽可能不要SELECT*,而应该查询需要用到的指定几个字段;(3)不要对两个大表进行联合,无论是内联或外联。对于需要对两个或多个表进行联合查询的情况,可以做两次或多次数据库查询;(4)在WHERE条件中,尽可能对同类型的数据列进行比较;(5)在WHERE条件中,尽量让有索引的数据列在比较表达始中单独出现;(6)在WHERE条件中,根据数据列排除不合条件数据量由多到少的次序排列条件,在不能确定排除数据多少的前提下,一般来说表达式中使用=、!=、<>要优先于>、<、>=、<=,更优先于LIKE(7)如果WHERE条件中的值是数字,那么不要使用单引号进行类型转换(8)如果WHERE条件中使用LIKE模式匹配,不要在模式开头使用通配符%(9)不要对WHERE条件中的非BINARY属性的CHAR/VARCHAR字段,进行大小写转换(10)尽可能不要在SELECT中使用GROUPBY(11)SQL中尽量使用短语法:INSERTINTOMYTABLE(FIELD1,FIELD2)VALUES(('x','y'),('p','q'));3.SQL语句汇总在编程中请将所有使用到的SQL语句列表归总,每个模块一个SQL记录表。每条语句进行EXPLAIN测试,并把10000次平均结果记录到SQL记录表中。五HTML代码1.XHTML标准(1)所有标签必须成对使用,input、img、br、hr等标签,可以使用/>的方式,例如:,(2)所有XHTML的标签、元素,必须使用英文小写字母(JavaScript和CSS例外)(3)所有XHTML标签的所有元素的属性,都需要使用英文双引号("),不允许使用单引号,更不允许不使用引号(4)对于selected,checked,请使用selected="selected",checked="checked"(5)使用、来代替、(6)不允许XHTML标签的混合嵌套,例如:abc(7)img标签必须指定alt元素的属性,即使是空值;a标签必须指定title元素的属性,即使是空值;2.可视化元素分离不允许在table、tr、td、th、div、span等标签中直接定义宽度、高度、边框、字体、字体大小、字体颜色、背景色、背景图等等可视化内容,一律使用CSS来定义六通用规1.引号所有字符串都使用单引号('),除非包含需要转义的字符(比如\n之类)才允许使用双引号"。字符串中如果需要包含变量/数组/对象,请将字符串拆分,用点(.)连接变量/数组/对象。向函数传递字符串变量,不要加引号。对于在HereDoc里面使用的变量/数组/对象,请用大括号嵌套。例如:/*wrong*/$str="Thisisareallylongstringwithnovariablesfortheparsertofind.";do_stuff("$str");$str="Thisisa$varstring";/*right*/$str='Thisisareallylongstringwithnovariablesfortheparsertofind.';do_stuff($str);$str='Thisisa'.$var.'string';2.关联数组关联数组当中,请用单引号将key的字符串嵌套(例如:$row['id']比$row[id]快7倍),如果key是变量则不要使用引号嵌套:/*wrong*/$foo=$assoc_array[blah];$foo=$assoc_array["$var"];/*right*/$foo=$assoc_array['blah'];$foo=$assoc_array[$var];3.注释以明确简洁的语句书写注释,注释格式使用PHPDocument格式(参见http://www.phpdoc.org/),即ZendStudio中自动提示的格式。4.类型比较对于提交/返回值,尽可能的使用===来检查类型是否匹配,这一点对于区分FALSE,NULL,'',0四种空值尤其有用(定义了的变量但未定义值,其值为NULL)。函数返回值请用TRUE和FALSE来代替1和0。对于比较字符串,必须使用strcmp()或者===,这样才进行类型检查。例如:var_dump('01'==1),返回结果为true,但是var_dump('01'===1)的结果就是false了对于in_array()函数,请加入第三个参数,设置为true,例如:in_array('01',array('1')),将不判断类型,返回结果为true。但是如果使用in_array('01',array('1'),true),将判断类型,返回结果为false。5.递增/递减运算符不允许在表达式中使用递增运算符(前加++$i,后加$i++)和递减运算符(前减--$i,后减$i--),这些运算符只能独自一行使用。递增/递减运算符不影响布尔值。递减NULL值也没有效果,但是递增NULL的结果是1。字符串变量只能递增(使用PERL的方式而非C的方式),不能递减。例如:/*wrong*/$array[++$i]=$j;$array[$i++]=$k;/*right*/$i++;$array[$i]=$j;$array[$i]=$k;$i++;递增使用前加++$i比后加$i++快,递减使用前减--$i比后减$i--快,;在方法里递增、递减局部变量是最快的,在函数里调用局部变量也是;递增、递减一个全局变量比局部变量要慢两倍;递增、递减一个对象的属性(例如$this->prop++)比局部变量慢3倍;递增、递减一个未定义的局部变量比一个预定义过的慢9-10倍;6.三元条件运算符三元条件运算符更适用于赋值,使得程序更为简洁。三元条件运算符不适合用作函数调用或者其它任何复杂的代码,这将会让代码变得晦涩难懂。例如:/*Badplacetousethem*/(($i<$size)&&($j>$size)) ?do_stuff($foo) :do_stuff($bar);/*OKplacetousethem*/$min=($i<$j) ?$i :$j;7.未初始化的变量请不要使用未初始化的变量!对于用户在HTML中提交的输入值,需要使用isset()来检测是否已被初始化。例如:/*Errorway*/if($_POST['forum']){...}/*Rightway*/if(isset($_POST['forum'])){...}8.变量/数组是否为空的检测判断变量和数组是否为空使用empty(),empty()会先检查是否已经初始化,因而无须同时使用isset()和empty()。不要使用count()来判断数组是否为空。例如:/*Errorway*/if(isset($_POST['forum'])&&!empty($_POST['forum'])){...}/*Rightway*/if(!empty($_POST['forum'])){...}9.正则表达式PHP支持两种风格的正则表达式:Perl-Compatible(preg) (和POSIXExtended(ereg) (在使用正则表达式的时候,首选的匹配词语定界符是斜线/,如果您的匹配词语中含有斜线,那么您可以使用#作为匹配词语定界符。例如:/*Err
do_stuff($i);
/*Theseareright.*/
for($i=0;$i{do_stuff();}2.大括号的位置在语言结构(if,else,while,switch,for,foreach)中和类(class)、函数(function)、方法(method)中,左、右大括号必须单独占一行,与其声明处在相同的缩进级别。例如:/*Theseareallwrong.*/if(condition){while(condition2){...}}else{...}/*Theseareright.*/if(condition){while(condition2){...}}else{...}/*Theseareallwrong.*/for($i=0;$i<$size;$i++){...}/*Theseareright.*/for($i=0;$i<$size;$i++){...}/*Theseareallwrong.*/while(condition){...}/*Theseareright.*/while(condition){...}/*Theseareallwrong.*/switch(condition){case:1...default:...}/*Theseareright.*/switch(condition){case:1...default:...}/*Theseareright.*/functiondo_stuff(){...}/*Theseareright.*/classsome_class{functiona_method(){...}}3.数组格式对于数组的定义,可以使用分行表述每个"key=>value,",每行开头使用一个Tab进行缩进。右括号和该array(的起始行保持对齐。例如:$arr=array('key1'=>'value1','index1'=>'value2',);4.在运算符之间使用空格在比较运算符(>、<、>=、<=、==、===、!=、<>、!==)、赋值运算符(=)、数学运算符(+、-、*、/、%)、位运算符(&、|、^、~、>>、<<)、逻辑运算符(!、&&、||)、冒号(:)、问号(?)、字符串连接运算符(.)、字符串连接赋值运算符(.=)前后,以及左括号(()前(函数调用例外)、逗号(,)后请使用空格进行间隔。例如:/*Theseareallwrong.*/$i=0;/*Theseareallright.*/$i=0;/*Theseareallwrong.*/if($i<7).../*Theseareallright.*/if($i<7).../*Theseareallwrong.*/if(($i<7)&&($j>8)).../*Theseareallright.*/if(($i<7)&&($j>8)).../*Theseareallwrong.*/do_stuff($i,"foo",$b);/*Theseareallright.*/do_stuff($i,"foo",$b);/*Theseareallwrong.*/for($i=0;$i<$size;$i++).../*Theseareallright.*/for($i=0;$i<$size;$i++).../*Theseareallwrong.*/$i=($j<$size)?0:1;/*Theseareallrightg.*/$i=($j<$size) ?0 :1;5.运算符优先级对于容易引起迷惑的表达式中不同运算符的优先级,请使用括号来区分优先级。例如:/*what'stheresult?whoknows.*/$bool=($i<7&&$j>8||$k==4);/*nowyoucanbecertainwhatI'mdoinghere.*/$bool=(($i<7)&&(($j<8)||($k==4)))6.条件语句请在条件陈述中使用&&和||,不要使用and和or。例如:/*Theseareallwrong.*/if(($i<7)and($j>8)).../*Theseareallright.*/if(($i<7)&&($j>8))...多重if...elseif...else最好换用选择结构体(switch...case)。7.语法结构在PHP中echo、exit(die)、return、continue、break、include、include_once、require、require_once等都属于语法结构,大部分语法结构都有两种形式:echo'Thisisastring';echo('Thisisastring');在PHP规定的允许使用的格式下,尽可能使用前一种语法结构的格式,而不要使用函数参数/表达式的形式,仅在参数包含表达式时才需要用括号将其括起来。当返回一个变量时通常不用括号,也建议不要用,这样既可以降低PHP的负担,又可以避免一些错误(见下)。注意:exit(die)只能使用括号结构对于return(),当用引用返回值时永远不要使用括号,只能通过引用返回变量,而不是语句的结果。如果使用return($a);时其实不是返回一个变量,而是表达式($a)的值(当然,此时该值也正是$a的值)。//won'twork,evaluatedasinclude(('vars.php')=='OK'),i.e.include('')if(include('vars.php')=='OK'){ echo'OK';}//worksif((include'vars.php')=='OK'){ echo'OK';}由于echo()是语法结构、没有返回值,所以速度比print()快。在输出多个字符串时,请使用echo的多参数方式(逗号,间隔),会比字符串连接方式(点.间隔)有更好的性能。8.类必须使用PHP5的__construct()和__destruct()方式,禁止使用PHP4的用与类同名函数的方式构造。避免使用魔术方法__get,__set,__autoload。在类里面多加函数不会影响性能。子类的方法比基类执行得更快。执行一个拥有一个参数和空函数体的函数相当于7-8次局部变量自增操作$localvar++,一个相似的方法调用当然就相当于15次局部变量自增操作$localvar++。别在对象构造函数中做实际的工作,构造函数应该包含变量的初始化,但不会发生失败的操作。即构造不能返回错误。例如classDevice{function__construct($param){//这里的代码应该不发生失败}functionopen(){//这里的代码返回失败和成功}}四SQL代码1.SQL代码层SQL关键词语大写(SELECT,INSERT,UPDATE,ALTER,DELETE,CREATE,TABLE,INDEX,COUNT,MAX,MIN,FROM,WHERE,AS,LEFTJOIN,RIGHTJOIN,ON,AND,ORDERBY,DESC,ASC,GROUPBY,LIMIT等等),按照逻辑分行,比如SELECT/INSERT/UPDATE/DELETE在一行,FROM在一行,LEFTJOIN…ON/RIGHTJOIN…ON在一行,WHERE在一行,ORDERBY在一行,GROUPBY在一行,LIMIT在一行。WHERE条件里面多个条件请使用括号来区分优先级。数据表名称请使用名词单数形式,一律使用英文小写字母。如果需要对名称作描述/分类,请在名词前/后加描述/分类关键词语,使用下划线间隔。例如:SELECTfield1ASsomething,field2,field3FROMtablea,tablebWHERE(this=that)AND(this2=that2)2.MySQL的查询性能优化原则(1)请不要在SELECT中使用DISTINCT;(2)尽可能不要SELECT*,而应该查询需要用到的指定几个字段;(3)不要对两个大表进行联合,无论是内联或外联。对于需要对两个或多个表进行联合查询的情况,可以做两次或多次数据库查询;(4)在WHERE条件中,尽可能对同类型的数据列进行比较;(5)在WHERE条件中,尽量让有索引的数据列在比较表达始中单独出现;(6)在WHERE条件中,根据数据列排除不合条件数据量由多到少的次序排列条件,在不能确定排除数据多少的前提下,一般来说表达式中使用=、!=、<>要优先于>、<、>=、<=,更优先于LIKE(7)如果WHERE条件中的值是数字,那么不要使用单引号进行类型转换(8)如果WHERE条件中使用LIKE模式匹配,不要在模式开头使用通配符%(9)不要对WHERE条件中的非BINARY属性的CHAR/VARCHAR字段,进行大小写转换(10)尽可能不要在SELECT中使用GROUPBY(11)SQL中尽量使用短语法:INSERTINTOMYTABLE(FIELD1,FIELD2)VALUES(('x','y'),('p','q'));3.SQL语句汇总在编程中请将所有使用到的SQL语句列表归总,每个模块一个SQL记录表。每条语句进行EXPLAIN测试,并把10000次平均结果记录到SQL记录表中。五HTML代码1.XHTML标准(1)所有标签必须成对使用,input、img、br、hr等标签,可以使用/>的方式,例如:,(2)所有XHTML的标签、元素,必须使用英文小写字母(JavaScript和CSS例外)(3)所有XHTML标签的所有元素的属性,都需要使用英文双引号("),不允许使用单引号,更不允许不使用引号(4)对于selected,checked,请使用selected="selected",checked="checked"(5)使用、来代替、(6)不允许XHTML标签的混合嵌套,例如:abc(7)img标签必须指定alt元素的属性,即使是空值;a标签必须指定title元素的属性,即使是空值;2.可视化元素分离不允许在table、tr、td、th、div、span等标签中直接定义宽度、高度、边框、字体、字体大小、字体颜色、背景色、背景图等等可视化内容,一律使用CSS来定义六通用规1.引号所有字符串都使用单引号('),除非包含需要转义的字符(比如\n之类)才允许使用双引号"。字符串中如果需要包含变量/数组/对象,请将字符串拆分,用点(.)连接变量/数组/对象。向函数传递字符串变量,不要加引号。对于在HereDoc里面使用的变量/数组/对象,请用大括号嵌套。例如:/*wrong*/$str="Thisisareallylongstringwithnovariablesfortheparsertofind.";do_stuff("$str");$str="Thisisa$varstring";/*right*/$str='Thisisareallylongstringwithnovariablesfortheparsertofind.';do_stuff($str);$str='Thisisa'.$var.'string';2.关联数组关联数组当中,请用单引号将key的字符串嵌套(例如:$row['id']比$row[id]快7倍),如果key是变量则不要使用引号嵌套:/*wrong*/$foo=$assoc_array[blah];$foo=$assoc_array["$var"];/*right*/$foo=$assoc_array['blah'];$foo=$assoc_array[$var];3.注释以明确简洁的语句书写注释,注释格式使用PHPDocument格式(参见http://www.phpdoc.org/),即ZendStudio中自动提示的格式。4.类型比较对于提交/返回值,尽可能的使用===来检查类型是否匹配,这一点对于区分FALSE,NULL,'',0四种空值尤其有用(定义了的变量但未定义值,其值为NULL)。函数返回值请用TRUE和FALSE来代替1和0。对于比较字符串,必须使用strcmp()或者===,这样才进行类型检查。例如:var_dump('01'==1),返回结果为true,但是var_dump('01'===1)的结果就是false了对于in_array()函数,请加入第三个参数,设置为true,例如:in_array('01',array('1')),将不判断类型,返回结果为true。但是如果使用in_array('01',array('1'),true),将判断类型,返回结果为false。5.递增/递减运算符不允许在表达式中使用递增运算符(前加++$i,后加$i++)和递减运算符(前减--$i,后减$i--),这些运算符只能独自一行使用。递增/递减运算符不影响布尔值。递减NULL值也没有效果,但是递增NULL的结果是1。字符串变量只能递增(使用PERL的方式而非C的方式),不能递减。例如:/*wrong*/$array[++$i]=$j;$array[$i++]=$k;/*right*/$i++;$array[$i]=$j;$array[$i]=$k;$i++;递增使用前加++$i比后加$i++快,递减使用前减--$i比后减$i--快,;在方法里递增、递减局部变量是最快的,在函数里调用局部变量也是;递增、递减一个全局变量比局部变量要慢两倍;递增、递减一个对象的属性(例如$this->prop++)比局部变量慢3倍;递增、递减一个未定义的局部变量比一个预定义过的慢9-10倍;6.三元条件运算符三元条件运算符更适用于赋值,使得程序更为简洁。三元条件运算符不适合用作函数调用或者其它任何复杂的代码,这将会让代码变得晦涩难懂。例如:/*Badplacetousethem*/(($i<$size)&&($j>$size)) ?do_stuff($foo) :do_stuff($bar);/*OKplacetousethem*/$min=($i<$j) ?$i :$j;7.未初始化的变量请不要使用未初始化的变量!对于用户在HTML中提交的输入值,需要使用isset()来检测是否已被初始化。例如:/*Errorway*/if($_POST['forum']){...}/*Rightway*/if(isset($_POST['forum'])){...}8.变量/数组是否为空的检测判断变量和数组是否为空使用empty(),empty()会先检查是否已经初始化,因而无须同时使用isset()和empty()。不要使用count()来判断数组是否为空。例如:/*Errorway*/if(isset($_POST['forum'])&&!empty($_POST['forum'])){...}/*Rightway*/if(!empty($_POST['forum'])){...}9.正则表达式PHP支持两种风格的正则表达式:Perl-Compatible(preg) (和POSIXExtended(ereg) (在使用正则表达式的时候,首选的匹配词语定界符是斜线/,如果您的匹配词语中含有斜线,那么您可以使用#作为匹配词语定界符。例如:/*Err
2.大括号的位置
在语言结构(if,else,while,switch,for,foreach)中和类(class)、函数(function)、方法(method)中,左、右大括号必须单独占一行,与其声明处在相同的缩进级别。
例如:
if(condition){
while(condition2){
...
}else{
while(condition2)
else
for($i=0;$i<$size;$i++){
for($i=0;$i<$size;$i++)
while(condition){
switch(condition){
case:
1
default:
switch(condition)
functiondo_stuff()
classsome_class
functiona_method()
3.数组格式
对于数组的定义,可以使用分行表述每个"key=>value,",每行开头使用一个Tab进行缩进。
右括号和该array(的起始行保持对齐。
$arr=array(
'key1'=>'value1',
'index1'=>'value2',
);
4.在运算符之间使用空格
在比较运算符(>、<、>=、<=、==、===、!
=、<>、!
==)、赋值运算符(=)、数学运算符(+、-、*、/、%)、位运算符(&、|、^、~、>>、<<)、逻辑运算符(!
、&&、||)、冒号(:
)、问号(?
)、字符串连接运算符(.)、字符串连接赋值运算符(.=)前后,以及左括号(()前(函数调用例外)、逗号(,)后请使用空格进行间隔。
$i=0;
/*Theseareallright.*/
if($i<7)...
if(($i<7)&&($j>8))...
do_stuff($i,"foo",$b);
for($i=0;$i<$size;$i++)...
$i=($j<$size)?
0:
1;
/*Theseareallrightg.*/
$i=($j<$size) ?
0 :
5.运算符优先级
对于容易引起迷惑的表达式中不同运算符的优先级,请使用括号来区分优先级。
/*what'stheresult?
whoknows.*/
$bool=($i<7&&$j>8||$k==4);
/*nowyoucanbecertainwhatI'mdoinghere.*/
$bool=(($i<7)&&(($j<8)||($k==4)))
6.条件语句
请在条件陈述中使用&&和||,不要使用and和or。
if(($i<7)and($j>8))...
多重if...elseif...else最好换用选择结构体(switch...case)。
7.语法结构
在PHP中echo、exit(die)、return、continue、break、include、include_once、require、require_once等都属于语法结构,大部分语法结构都有两种形式:
echo'Thisisastring';
echo('Thisisastring');
在PHP规定的允许使用的格式下,尽可能使用前一种语法结构的格式,而不要使用函数参数/表达式的形式,仅在参数包含表达式时才需要用括号将其括起来。
当返回一个变量时通常不用括号,也建议不要用,这样既可以降低PHP的负担,又可以避免一些错误(见下)。
注意:
exit(die)只能使用括号结构
对于return(),当用引用返回值时永远不要使用括号,只能通过引用返回变量,而不是语句的结果。
如果使用return($a);时其实不是返回一个变量,而是表达式($a)的值(当然,此时该值也正是$a的值)。
//won'twork,evaluatedasinclude(('vars.php')=='OK'),i.e.include('')
if(include('vars.php')=='OK')
echo'OK';
//works
if((include'vars.php')=='OK')
由于echo()是语法结构、没有返回值,所以速度比print()快。
在输出多个字符串时,请使用echo的多参数方式(逗号,间隔),会比字符串连接方式(点.间隔)有更好的性能。
8.类
必须使用PHP5的__construct()和__destruct()方式,禁止使用PHP4的用与类同名函数的方式构造。
避免使用魔术方法__get,__set,__autoload。
在类里面多加函数不会影响性能。
子类的方法比基类执行得更快。
执行一个拥有一个参数和空函数体的函数相当于7-8次局部变量自增操作$localvar++,一个相似的方法调用当然就相当于15次局部变量自增操作$localvar++。
别在对象构造函数中做实际的工作,构造函数应该包含变量的初始化,但不会发生失败的操作。
即构造不能返回错误。
例如
classDevice
function__construct($param)
//这里的代码应该不发生失败
functionopen()
//这里的代码返回失败和成功
四SQL代码
1.SQL代码层
SQL关键词语大写(SELECT,INSERT,UPDATE,ALTER,DELETE,CREATE,TABLE,INDEX,COUNT,MAX,MIN,FROM,WHERE,AS,LEFTJOIN,RIGHTJOIN,ON,AND,ORDERBY,DESC,ASC,GROUPBY,LIMIT等等),按照逻辑分行,比如SELECT/INSERT/UPDATE/DELETE在一行,FROM在一行,LEFTJOIN…ON/RIGHTJOIN…ON在一行,WHERE在一行,ORDERBY在一行,GROUPBY在一行,LIMIT在一行。
WHERE条件里面多个条件请使用括号来区分优先级。
数据表名称请使用名词单数形式,一律使用英文小写字母。
如果需要对名称作描述/分类,请在名词前/后加描述/分类关键词语,使用下划线间隔。
SELECTfield1ASsomething,field2,field3
FROMtablea,tableb
WHERE(this=that)AND(this2=that2)
2.MySQL的查询性能优化原则
(1)请不要在SELECT中使用DISTINCT;
(2)尽可能不要SELECT*,而应该查询需要用到的指定几个字段;
(3)不要对两个大表进行联合,无论是内联或外联。
对于需要对两个或多个表进行联合查询的情况,可以做两次或多次数据库查询;
(4)在WHERE条件中,尽可能对同类型的数据列进行比较;
(5)在WHERE条件中,尽量让有索引的数据列在比较表达始中单独出现;
(6)在WHERE条件中,根据数据列排除不合条件数据量由多到少的次序排列条件,在不能确定排除数据多少的前提下,一般来说表达式中使用=、!
=、<>要优先于>、<、>=、<=,更优先于LIKE
(7)如果WHERE条件中的值是数字,那么不要使用单引号进行类型转换
(8)如果WHERE条件中使用LIKE模式匹配,不要在模式开头使用通配符%
(9)不要对WHERE条件中的非BINARY属性的CHAR/VARCHAR字段,进行大小写转换
(10)尽可能不要在SELECT中使用GROUPBY
(11)SQL中尽量使用短语法:
INSERTINTOMYTABLE(FIELD1,FIELD2)VALUES(('x','y'),('p','q'));
3.SQL语句汇总
在编程中请将所有使用到的SQL语句列表归总,每个模块一个SQL记录表。
每条语句进行EXPLAIN测试,并把10000次平均结果记录到SQL记录表中。
五HTML代码
1.XHTML标准
(1)所有标签必须成对使用,input、img、br、hr等标签,可以使用/>的方式,例如:
,
(2)所有XHTML的标签、元素,必须使用英文小写字母(JavaScript和CSS例外)
(3)所有XHTML标签的所有元素的属性,都需要使用英文双引号("),不允许使用单引号,更不允许不使用引号
(4)对于selected,checked,请使用selected="selected",checked="checked"
(5)使用、来代替、
(6)不允许XHTML标签的混合嵌套,例如:
abc
(7)img标签必须指定alt元素的属性,即使是空值;a标签必须指定title元素的属性,即使是空值;
2.可视化元素分离
不允许在table、tr、td、th、div、span等标签中直接定义宽度、高度、边框、字体、字体大小、字体颜色、背景色、背景图等等可视化内容,一律使用CSS来定义
六通用规
1.引号
所有字符串都使用单引号('),除非包含需要转义的字符(比如\n之类)才允许使用双引号"。
字符串中如果需要包含变量/数组/对象,请将字符串拆分,用点(.)连接变量/数组/对象。
向函数传递字符串变量,不要加引号。
对于在HereDoc里面使用的变量/数组/对象,请用大括号嵌套。
/*wrong*/
$str="Thisisareallylongstringwithnovariablesfortheparsertofind.";
do_stuff("$str");
$str="Thisisa$varstring";
/*right*/
$str='Thisisareallylongstringwithnovariablesfortheparsertofind.';
do_stuff($str);
$str='Thisisa'.$var.'string';
2.关联数组
关联数组当中,请用单引号将key的字符串嵌套(例如:
$row['id']比$row[id]快7倍),如果key是变量则不要使用引号嵌套:
$foo=$assoc_array[blah];
$foo=$assoc_array["$var"];
$foo=$assoc_array['blah'];
$foo=$assoc_array[$var];
3.注释
以明确简洁的语句书写注释,注释格式使用PHPDocument格式(参见http:
//www.phpdoc.org/),即ZendStudio中自动提示的格式。
4.类型比较
对于提交/返回值,尽可能的使用===来检查类型是否匹配,这一点对于区分FALSE,NULL,'',0四种空值尤其有用(定义了的变量但未定义值,其值为NULL)。
函数返回值请用TRUE和FALSE来代替1和0。
对于比较字符串,必须使用strcmp()或者===,这样才进行类型检查。
var_dump('01'==1),返回结果为true,但是var_dump('01'===1)的结果就是false了
对于in_array()函数,请加入第三个参数,设置为true,例如:
in_array('01',array('1')),将不判断类型,返回结果为true。
但是如果使用in_array('01',array('1'),true),将判断类型,返回结果为false。
5.递增/递减运算符
不允许在表达式中使用递增运算符(前加++$i,后加$i++)和递减运算符(前减--$i,后减$i--),这些运算符只能独自一行使用。
递增/递减运算符不影响布尔值。
递减NULL值也没有效果,但是递增NULL的结果是1。
字符串变量只能递增(使用PERL的方式而非C的方式),不能递减。
$array[++$i]=$j;
$array[$i++]=$k;
$i++;
$array[$i]=$j;
$array[$i]=$k;
递增使用前加++$i比后加$i++快,递减使用前减--$i比后减$i--快,;
在方法里递增、递减局部变量是最快的,在函数里调用局部变量也是;
递增、递减一个全局变量比局部变量要慢两倍;
递增、递减一个对象的属性(例如$this->prop++)比局部变量慢3倍;
递增、递减一个未定义的局部变量比一个预定义过的慢9-10倍;
6.三元条件运算符
三元条件运算符更适用于赋值,使得程序更为简洁。
三元条件运算符不适合用作函数调用或者其它任何复杂的代码,这将会让代码变得晦涩难懂。
/*Badplacetousethem*/
(($i<$size)&&($j>$size)) ?
do_stuff($foo) :
do_stuff($bar);
/*OKplacetousethem*/
$min=($i<$j) ?
$i :
$j;
7.未初始化的变量
请不要使用未初始化的变量!
对于用户在HTML中提交的输入值,需要使用isset()来检测是否已被初始化。
/*Errorway*/
if($_POST['forum'])
/*Rightway*/
if(isset($_POST['forum']))
8.变量/数组是否为空的检测
判断变量和数组是否为空使用empty(),empty()会先检查是否已经初始化,因而无须同时使用isset()和empty()。
不要使用count()来判断数组是否为空。
if(isset($_POST['forum'])&&!
empty($_POST['forum']))
if(!
9.正则表达式
PHP支持两种风格的正则表达式:
Perl-Compatible(preg) (和POSIXExtended(ereg) (
在使用正则表达式的时候,首选的匹配词语定界符是斜线/,如果您的匹配词语中含有斜线,那么您可以使用#作为匹配词语定界符。
/*Err
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2