网站开发编码规范 v2.docx
- 文档编号:6682852
- 上传时间:2023-01-08
- 格式:DOCX
- 页数:29
- 大小:38.44KB
网站开发编码规范 v2.docx
《网站开发编码规范 v2.docx》由会员分享,可在线阅读,更多相关《网站开发编码规范 v2.docx(29页珍藏版)》请在冰豆网上搜索。
网站开发编码规范v2
编码约定
2011年6月11日
发布单位:
××部
前言
我公司参与网站前后端编码的人员具有一定的流动性,往往会造成源代码的延续性和可读性严重降低.经常出现新同事拿到工作任务时,面对源代码一筹莫展的情况.很多项目和网站的维护困难重重.为解决这一尴尬的窘境,特发布此编码规范.
对于已有的源代码,工作人员在修改的时候请依照本规范将原有代码规范化.
目录
编码约定1
前言3
PHP代码规范4
1编辑器设置4
1.1使用Tab缩进,不要使用空格4
1.2UNIX文件格式4
2命名约定4
2.1公共库名称空间4
2.2常量名4
2.3变量名5
2.4循环索引变量5
2.5类的方法命名6
2.6函数命名6
2.7函数自变量6
2.8名称空间与类命名6
2.9文件命名7
3代码层7
3.1使用大括号7
3.2大括号的位置8
3.3数组格式9
3.4在运算符之间使用空格10
3.5运算符优先级11
3.6条件语句11
3.7语法结构11
3.8类12
4SQL代码13
4.1SQL代码层13
4.2MySQL的查询性能优化原则13
4.3SQL语句汇总14
5HTML代码14
5.1XHTML标准14
5.2可视化元素分离14
6通用规定14
6.1引号14
6.2关联数组15
6.3注释15
6.4类型比较16
6.5递增/递减运算符16
6.6三元条件运算符17
6.7未初始化的变量17
6.8变量/数组是否为空的检测18
6.9正则表达式18
6.10使用file_get_contents/file_put_contents19
6.11Global/Request/Session/Server变量19
6.12输出header()20
6.13上传文件类型20
6.14字符串的大小写转换20
6.15PHP标签20
6.16程序文件末尾21
6.17magic_quotes_gpc21
6.18包含文件21
6.19遍历数组21
6.20避免修改for循环内的条件值21
6.21用常量代替函数22
6.22不信任intval()22
6.23目录权限22
6.24临时文件23
6.25静态方法和静态调用23
6.26时间问题23
6.27绝对路径23
6.28错误信息23
7AIPLIB公共库目录结构(根据项目不同分别制订)24
PHP代码规范
本文约定了在公司所有项目中均须遵守的代码规范标准,除特殊原因外所有新开发的程序须遵守此标准。
如果在程序中使用了PEAR的代码或者PECL的扩展函数库,请不要修改其源代码,除非绝对必要(需要另行撰写说明文档注明)。
1编辑器设置
1.1使用Tab缩进,不要使用空格
鉴于很多编辑器在保存文件时会自动清除用于缩进的空格,所以我们一律使用Tab键进行缩进。
1.2UNIX文件格式
请将编辑器设置对所有程序使用UNIX格式保存,不要使用Win32或者Mac的格式。
例如,EditPlus里面Document->FileFormat(CR/LF)->Unix。
对于windows格式文件,以Ctrl+M结束(vim下为^M),需要过滤掉:
$text=strtr($text,"\x0D","");
文件名统一用小写。
2命名约定
2.1公共库名称空间
ALPLIB,AILIPHPLibrary
2.2常量名
全局常量,用'_'分隔每个单词,使用TPLIB_前缀。
如:
define("AIPLIB_TEST_HELLO","Helloworld!
");
类常量,用'_'分隔每个单词,如:
classAIPLIB_Package
{
constEXAMPLE_CONST;
}
尽量使用类常量代替全局常量。
每个项目内部不要使用外部全局常量。
2.3变量名
局部变量的字母使用驼峰式命名,首字母小写。
如:
$engineName
适用于模板变量和JS内的变量命名。
函数、方法的参数,使用骆驼命名法命名,首字母为小写。
如:
functiontest_func($paramName)
{
}
类属性,使用骆驼命名法命名,与函数、方法的参数命名方法相同;
全局变量,字母都使用大写,使用“_”作为每个词的分界,公共库中无特殊需求不使用全局变量。
尽量不要使用全局变量。
命名必须具有描述性,但务求简练。
不要在变量名中使用长句。
通常在变量名中使用一对词语(驼峰式)对变量进行简要描述这种方式更好。
2.4循环索引变量
在循环结构中,仅允许使用一个字母长度的循环索引变量。
通常我们使用$i,如果存在嵌套循环,那么子循环的索引变量应该使用$j,其下级循环的索引变量就是$k,以此类推。
如果循环被原已存在一些有具体含义名称的变量索引,则不受此规定约束。
例如:
for($i=0;$i<$outer_size;$i++)
{
for($j=0;$j<$inner_size;$j++)
{
foo($i,$j);
}
}
2.5类的方法命名
使用骆驼命名法命名,例如getCache()、echoName()。
名字采用“动词+宾语”的形式。
例如write(动词)Cache(宾语)。
2.6函数命名
函数应该使用描述性词语命名。
我们不使用C的方式,也不使用类似"stristr()"这种没有描述、令人费解的函数名。
所有函数名必须全部使用英文小写字母,函数名中的单词之间使用下划线间隔。
某些情况下,函数名中更适合使用动词。
例如:
print_login_status(),get_user_data(),等等。
一个基本的哲学观点,就是不要仅仅出于懒惰而去破坏代码的清晰。
比如print_login_status_for_a_given_user()太长,换成print_user_login_status()会更好,或者仅仅用print_login_status()。
2.7函数自变量
自变量的命名应遵守变量命名规定。
我们不想使用do_stuff($a,$b,$c)中的$a,$b,$c这种缺乏实际表述意义的名称。
多数情况下,我们希望能够仅仅通过查看函数的声明就可以了解如何去使用函数。
2.8名称空间与类命名
使用帕斯卡命名方法,如HelloWorld。
由于PHP5.3版本之前没有实现命名空间语法,这给类命名带来了一定的麻烦。
这里使用类名中附带名称空间的命名方法,名称空间与类名间使用下划线连接。
如AIPLIB库中Test包的HelloWorld类:
AIPLIB_Test_HelloWorld
所有库中的类,都以AIPLIB_开头,根据用途命名。
将类名字中的“_”替换为目录分隔符,就是这个类的定义文件所在位置。
这种命名规则和目录结构可以避免命名冲突,根据类名字就能找到文件存放位置。
如:
AIPLIB_Test_HelloWorld类在库中的位置为
aiplib/test/helloworld.php(文件名小写)
Admin_Test_HelloWorld类在库中的位置为
admin_proj/test/helloworld.php(文件名小写)
admin_proj/test/Helloworld.php(错误)
2.9文件命名
包含文件应该以.inc.php方式命名,例如config.inc.php。
单独类的文件使用classname.php方式命名,包中的类使用packagename/className.php命名。
文件名全小写。
3代码层
3.1使用大括号
在语言结构(if,else,while,switch,for,foreach)中请在陈述与执行的代码分行,执行的代码放到大括号中,大括号不可省略。
例如:
/*错误的写法.*/
if(condition)do_stuff();
if(condition)
do_stuff();
while(condition)
do_stuff();
for($i=0;$i do_stuff($i); /*正确的写法.*/ if(condition){ do_stuff(); } while(condition){ do_stuff(); } for($i=0;$i do_stuff(); } 3.2大括号的位置 在语言结构(if,else,while,switch,for,foreach)中和类(class)、函数(function)、方法(method)中,左大括号跟在声明结尾、右大括号必须单独占一行,与其声明处在相同的缩进级别。 例如: /*正确的写法.*/ if(condition){ while(condition2){ ... } }else{ ... } /*错误的写法.*/ if(condition) { while(condition2) { ... } } else { ... } /*正确的写法.*/ for($i=0;$i<$size;$i++){ ... } /*错误的写法.*/ for($i=0;$i<$size;$i++) { ... } /*正确的写法.*/ while(condition){ ... } /*错误的写法.*/ while(condition) { ... } /*正确的写法.*/ switch(condition){ case: 1 ... default: ... } /*错误的写法.*/ switch(condition) { case: 1 ... default: ... } /*正确的写法.*/ functiondo_stuff(){ ... } /*正确的写法.*/ classsome_class{ functiona_method(){ ... } } 3.3数组格式 对于数组的定义,可以使用分行表述每个"key=>value,",每行开头使用一个Tab进行缩进。 右括号和该array(的起始行保持对齐。 例如: $arr=array( 'key1'=>'value1', 'index1'=>'value2', ); 3.4在运算符之间使用空格 在比较运算符(>、<、>=、<=、==、===、! =、<>、! ==)、赋值运算符(=)、数学运算符(+、-、*、/、%)、位运算符(&、|、^、~、>>、<<)、逻辑运算符(! 、&&、||)、冒号(: )、问号(? )、字符串连接运算符(.)、字符串连接赋值运算符(.=)前后,以及左括号(()前(函数调用例外)、逗号(,)后请使用空格进行间隔。 例如: /*错误的写法.*/ $i=0; /*正确的写法.*/ $i=0; /*错误的写法.*/ if($i<7)... /*正确的写法.*/ if($i<7)... /*错误的写法.*/ if(($i<7)&&($j>8))... /*正确的写法.*/ if(($i<7)&&($j>8))... /*错误的写法.*/ do_stuff($i,"foo",$b); /*正确的写法.*/ do_stuff($i,"foo",$b); /*错误的写法.*/ for($i=0;$i<$size;$i++)... /*正确的写法.*/ for($i=0;$i<$size;$i++)... /*错误的写法.*/ $i=($j<$size)? 0: 1; /*正确的写法g.*/ $i=($j<$size) ? 0 : 1; 3.5运算符优先级 对于容易引起迷惑的表达式中不同运算符的优先级,请使用括号来区分优先级。 例如: /*what'stheresult? whoknows.*/ $bool=($i<7&&$j>8||$k==4); /*nowyoucanbecertainwhatI'mdoinghere.*/ $bool=(($i<7)&&(($j<8)||($k==4))) 3.6条件语句 请在条件陈述中使用&&和||,不要使用and和or。 例如: /*错误的写法.*/ if(($i<7)and($j>8))... /*正确的写法.*/ if(($i<7)&&($j>8))... 多重if...elseif...else最好换用选择结构体(switch...case)。 3.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'OK'; } 由于echo()是语法结构、没有返回值,所以速度比print()快。 在输出多个字符串时,请使用echo的多参数方式(逗号,间隔),会比字符串连接方式(点.间隔)有更好的性能。 3.8类 必须使用PHP5的__construct()和__destruct()方式,禁止使用PHP4的用与类同名函数的方式构造。 避免使用魔术方法__get,__set,__autoload。 在类里面多加函数不会影响性能。 子类的方法比基类执行得更快。 执行一个拥有一个参数和空函数体的函数相当于7-8次局部变量自增操作$localvar++,一个相似的方法调用当然就相当于15次局部变量自增操作$localvar++。 别在对象构造函数中做实际的工作,构造函数应该包含变量的初始化,但不会发生失败的操作。 即构造不能返回错误。 例如 classDevice{ function__construct($param){ //这里的代码应该不发生失败 } functionopen(){ //这里的代码返回失败和成功 } } 4SQL代码 4.1SQL代码层 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条件里面多个条件请使用括号来区分优先级。 数据表名称请使用名词单数形式,一律使用英文小写字母。 如果需要对名称作描述/分类,请在名词前/后加描述/分类关键词语,使用下划线间隔。 字段名建议使用表名缩写作为前缀。 例如: $sql“SELECTfield1ASsomething,field2,field3 FROMtablea,tableb WHERE(this=that)AND(this2=that2)”; 4.2MySQL的查询性能优化原则 (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')); 4.3SQL语句汇总 在编程中请将所有使用到的SQL语句列表归总,每个模块一个SQL记录表。 每条语句进行EXPLAIN测试,并把10000次平均结果记录到SQL记录表中。 5HTML代码 5.1XHTML标准 (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元素的属性,即使是空值; 5.2可视化元素分离 不允许在table、tr、td、th、div、span等标签中直接定义宽度、高度、边框、字体、字体大小、字体颜色、背景色、背景图等等可视化内容,一律使用CSS来定义 6通用规定 6.1引号 所有字符串都使用单引号('),除非包含需要转义的字符(比如\n之类)才允许使用双引号"。 字符串中如果需要包含变量/数组/对象,请将字符串拆分,用点(.)连接变量/数组/对象。 向函数传递字符串变量,不要加引号。 对于在HereDoc里面使用的变量/数组/对象,请用大括号嵌套。 例如: /*wrong*/ $str="Thisisareallylongstringwithnovariablesfortheparsertofind."; do_stuff("$str"); $str="Thisisa$varstring"; /*right*/ $str='Thisisareallylongstringwithnovariablesfortheparsertofind.'; do_stuff($str); $str='Thisisa'.$var.'string'; 6.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]; 6.3注释 以明确简洁的语句书写注释,注释格式使用PHPDocument格式(参见http: //www.phpdoc.org/),即ZendStudio中自动提示的格式。 Ø单行注释采用格式//2010-3-2gaojj注释说明;如果修改的内容逻辑比较多, ◆可以在修改的内容顶部采用注释//2010-3-2gaojj注释说明START, ◆在内容尾部采用注释//2010-3-2gaojj注释说明END Ø函数和类的定义需使用phpdoc的格式说明 /** *函数说明 *@paramstring$param1参数一 *@parambool$param2参数二 @returnarray返回数组 */ Ø//@FIXME标识该处程序需要修正 //@TODO标识需要实现的功能,以备以后继续完善 Ø多行代码要注释且中间有逻辑换行的 /* bugstart …… end */ 6.4类型比较 对于提交/返回值,尽可能的使用===来检查类型是否匹配,这一点对于区分FALSE,NULL,'',0四种空值尤其有用(定义了的变量但未定义值,其值为NULL)。 函数返回值请用TRUE和FALSE来代替1和0。 对于比较字符串,必须使用strcmp()或者===,这样才进行类型检查。 例如: var_dump('01'==1),返回结果为true,但是var_dump('01'===1)的结果就是false了 对于in_arra
,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 网站开发编码规范 v2 网站 开发 编码 规范
![提示](https://static.bdocx.com/images/bang_tan.gif)