标题:php开发规范 出处:沧海一粟 时间:Sun, 18 Jan 2009 12:27:47 +0000 作者:jed 地址:http://www.dzhope.com/post/507/ 内容: 一、规范前言篇 标准化不是特殊的个人风格,它让程序员可以了解任何代码,弄清程序的状况;新人可 以很快的适应环境;防止新接触php的人一次次的犯同样的错误;在一致的开发环境下, 可以减少人们犯错的机会。本规范的标准在绝对多数应用上为仿照java技术体系,因为 java技术体系以其众多成功的案例成为大部分计算机应用层的工业标准,此外便于日后 公司向java技术体系转型。 二、命名定义篇 局部变量命名 使用英文名词、动词,以大写字母作为单词的分隔,其他的字母均使用小写,单词的 首个字母使用小写,不使用下划线,例: $repeatCount = ''; $delUserSql = ''; 全局常量命名 使用英文名词、动词,所有字母都使用大写,以下划线分隔每个单词,例: define( 'WEBSITE_NAME', '名称' ); define( 'WEBSITE_URL', '地址' ) 数组变量命名 使用英文名词、动词,以大写字母作为单词的分隔,其他的字母均使用小写,单词的首 个字母使用小写,不使用下划线,以字符串Array为后缀,例: $scopeArray = array(); $bookIdArray = array(); 静态变量命名 使用英文名词、动词,以大写字母作为单词的分隔,其他的字母均使用小写,单词的首 个字母使用小写,不使用下划线,以字符串Static为后缀,例: function getDirectoryFile() { static $fileArrayStatic = ''; static $fileNumStatic = ''; ... } 对象变量命名 使用类名称为变量前缀,所有字母都使用大写,以字符串_OBJECT为后缀,例: $USERACCOUNT_OBJECT = new UserAccount(); $PAINTINGORDER_OBJECT = new PaintingOrder(); 类命名 使用英文名词,以大写字母作为词的分隔,其他的字母均使用小写,名词的首个字母 使用大写,不使用下划线,例: class UserAccount { ... } class PaintingOrder { ... } 方法命名 使用英文名词、动词,以大写字母作为词的分隔,其他的字母均使用小写,单词的首个 字母使用小写,不使用下划线,例: class UserAccount { function isAccountOk() { ... } function addAccount() { ... } } 方法中参数命名 使用英文名词、动词,以大写字母作为词的分隔,其他的字母均使用小写,单词的首个字母 使用小写,不使用下划线,例: class UserAccount { function isAccountOk( $accountName ) { $this->accountName = $accountName; ... } function addAccount( $inputDataArray ) { $this->inputArray = $inputDataArray; ... } var $accuntName = ''; var $inputArray = ''; } 类属性命名 使用英文名词、动词,以大写字母作为词的分隔,其他的字母均使用小写,单词的首个字母 使用大写,不使用下划线,对于类属性为某个对象变量,则以字符串Object为后缀,例: class UserAccount { function IsAccountOk() { ... } function AddAccount() { ... } var $tableName = ''; var $databaseObject = ''; } 三、语法书写篇 大括号{}规则 将大括号放置在关键词下方的同列处,例: if ( $condition ) { ... } 不使用此种方式: if ( $condition ) { ... } 代码缩进规则 使用制表符缩进(TAB键)或四个空格。如果缩进层数大于四的时候,请重新设计该项业务逻辑的算法。 小括号()规则 不要把小括号和关键词、方法名、方法参数紧贴在一起,要用一个空格分隔,例: if ( $condition ) { ... } function addAccount( $inputDataArray ) { ... } 由于小括号与关键词等紧贴容易被看成是一体,因此不要使用以下方式,例: if ($condition) { ... } function addAccount($inputDataArray) { ... } if .. else ... 规则 通常最好有一个else块以用于处理未处理到的或未知的其他情况,即使条件处理语句 只有一个也必须使用大括号{},例: if ( $condition1 ) { ... } else if ( $condition2 ) { ... ... } else { ... } 尽可能避免以下使用方式,例: if ( $condition1 ) ... else ... switch规则 每个case块结束处必须加上break,而default总应该存在处理未知情况,例: switch( $condition ) { case $value1: ... break; case $value2: ... break; default: ... break; } 声明定位规则 声明代码块需要对齐,且初次使用变量时需要初始化,例: var $tableName = ''; var $databaseObject = ''; 不使用以下方式,例: var $tableName; var $accuntName = ''; var $databaseObject = ''; 四、其它说明篇 所有类方法必须有返回值,除结果简单外返回true或者false之外,其它方法应返回不同的值 以交作流程进一步处理。 html的form表单统一不设置submit按钮的名称属性(name)。 html的form表单各个元素名称与数据库字段保持一致。 每行一个语句。 不要采用缺省方法测试非零值,必须显式测试,例: if ( false != $this->IsAccountOk() ) { ... } else { ... } 不要使用以下方式,例: if ( $this->IsAccountOk() ) { ... } else { ... } 不要使用三元逻辑符 ? :,但对变量的赋值除外,例: $_GET['act'] = !empty( $_GET['act'] ) ? $_GET['act'] : 'v_login'; 统一使用,禁止使用格式。 对于get、post、session类型变量,必须使用$_GET、$_POST、$_SESSION方式定义和调用。 尽可能使用单引号''而不是双引号""。 使用完毕后的数组变量、对象变量、查询集合必须马上使用unset()、free_result()释放资源。 一个php文件只能包含一个类定义编码,以类名称作为文件名称。 php文件中绝不能出现html语句,html文件中尽可能避免出现php语句。 html文件必须通过w3c的html4检测认证(http://validator.w3.org/)。 如果发觉您在程序中的命名只有少量能和其对应事物相匹配的话,请重新设计系统。 在为类命名前首先要知道它是什么。如果通过类名提供的线索,您还是想不起这个类是什么的话, 那么您的设计是做得不够好。 超过三个单词组成的混合名是容易造成系统各个实体间的混淆,请重新设计类。 通常每个方法只执行一项逻辑动作事务,所以对它们的命名应该清楚的说明它们是做什么的:用checkForErrors()代替errorCheck(),用dumpDataToFile()代替dataFile()。 这么做使功能和数据成为更可区分的物体。 五、程序注释篇 类的注释 /* * Purpose: * 作为通用接口访问数据库的类 * Class Name: * Database * Author: * unixdotnet ccie_gzb@21cn.net * Modifications: * 2004-08-18 09:15 * 添加db_insert_id()方法 * unixdotnet ccie_gzb@21cn.net * See: 参照说明 */ class Database { …… } 类方法的注释 /* * Purpose: * 取得上一步数据库insert操作产生的id * Method Name: * getInsertId() * Parameter: * Return: * int * Author: * unixdotnet ccie_gzb@21cn.net * Modifications: * 2004-08-18 09:15 * 修改原因 * unixdotnet ccie_gzb@21cn.net * See: 参照说明 */ function getInsertId() { ... } 类属性的注释 class Database { /* * Purpose: * 连接数据库所需的用户名 * Attribute Name: * $databaseUserName * Type: string * Author: * unixdotnet ccie_gzb@21cn.net * Modifications: * 2004-08-18 09:15 * 修改原因 * unixdotnet ccie_gzb@21cn.net * See: 参照说明 */ var $databaseUserName; ... } 六、数据库应用篇 数据库的设计必须符合三个范式(极端要求常用高速时考虑单独设置记录表除外)。 数据库名称应该由概述项目内容的小写英文名词组成,以下划线分隔单词, 避免跨平台时可能出现的大小写错误。 数据表名称应该由物件对象名称的小写英文名词组成(尽可能对应系统中的业务类名称), 以下划线分隔单词,避免跨平台时可能出现的大小写错误。 数据表的字段应避免使用varchar、text等不定长的类型,时间信息的字段使用unix tiemstamp类型存储。 查询数据时禁止使用*通配符避免占用资源加速处理速度,尽量避免使用临时表。 查询数据连接多表时各资源应该使用全名称,即tableName.fieldName,而不是fieldName。 SQL语句应尽可能符合ansi92标准,避免使用特定数据库对SQL语言的扩充特性。 开发结束后,必须针对SQL查询语句的条件语句部分(where)添加索引, 须匹配多个条件的应该使用聚合索引。 索引的组成应由左至右匹配条件语句的顺序。 严禁盲目添加索引,避免减慢数据插入的速度、增大占用空间及减慢查询速度。 每当数据库(表)发生结构性变化时须登记保存;日常须定时(不超过三个工作日) 备份数据库结构及其数据。 Generated by Bo-blog 2.1.1 Release