俗话说,无规矩不成方圆。程序开发也如此,规范整洁的代码,让程序猿们看的是心旷神怡。即使代码只有自己看,规范的代码,自我感觉也要良好。何况,在团队开发中,代码不可能只有自己看。规范的代码是一个程序员的职业修养,是评判一个程序猿是否Professional的一个重要标准。现在,跟随小猪的脚步,走一遍PHP的代码规范。
一、 文件结构
|
|――images
|――include
|――parameter
|――config
|――function
|――index
images存放图片文件,include中是系统是要引用的文件,一般在parameter中存放参数文件,config中存放配置文件,function中存放方法文件,如javascript的方法等,并按功能模块的分类,将各功能的类也放入其中。( 恩,这很重要,分开放的目的和厨房要和卫生间在不同的屋是一个道理,不解释。)
二、文件名
文件夹命名一般采用英文,长度一般不超过20个字符,命名采用小写字母。除特殊情况才使用中文拼音,一些常见的文件夹命名如:images(存放图形文件),flash(存放Flash文件),style(存放CSS文件),scripts(存放Javascript脚本),inc(存放include文件),link(存放友情链接),media(存放多媒体文件)等。文件名称统一用小写的英文字母、数字和下划线的组合。( 此处说的是文件夹名字,和文件名的明明规范。比如xgmm.php, 靠,这是啥,“瞎搞美眉”??原来是想叫“修改密码”啊,看到这样的命名,程序员从树上掉下来了。。。)
三、源文件编码规范
3.1 开头注释
所有的源文件都应该在开头有一个C语言风格的注释,其中列出类名、功能、版本信息、日期、作者和版权声明:
1 /* 2 * 类名 3 * 功能 4 * 版本 5 * 日期 6 * 作者 7 * 版权 8 */
如果对文件进行了修改,应该在文件头中说明修改目的、修改日期、修改人,并变更文件的版本信息;如果修改问文件的一部分,则在文件中进行注释即可,并且标识出修改部分的起止位置
…… /* * 修改目的 * 修改日期 * 修改人 * 版本 */ ……
//修改起始 …… …… //修改结束 ……
(注释很重要,没注释的代码,就像没有提示的文言文,看的很不爽啊)
3.2 引入语句
引入语句应该位于文件的头部,并在引入时说明引入文件的作用。例如:
1 //数据库操作类 2 3 require( “db.php” );
3.3 类的声明 编写类内部的次序
1 类文档注释(/**……*/) 该注释中所需包含的信息,参见"文档注释"
2 类的声明
3 类实现的注释(/*……*/)如果有必要的话 该注释应包含任何有关整个类的信息,而这些信息又不适合作为类文档注释。
4 类的(静态)变量 首先是类的公共变量,随后是保护变量,再后是包一级别的变量(没有访问修饰符,access modifier),最后是私有变量。
5 实例变量 首先是公共级别的,随后是保护级别的,再后是包一级别的(没有访问修饰符),最后是私有级别的。
6 构造器
7 方法 这些方法应该按功能,而非作用域或访问权限,分组。例如,一个私有的类方法可以置于两个公有的实例方法之间。其目的是为了更便于阅读和理解代码.
3.4 缩进排版
4个空格常被作为缩进排版的一个单位。缩进的确切解释并未详细指定(空格 vs. 制表符)。一个制表符等于8个空格(而非4个),所以在某些编辑器中,需要特别指定一下制表符的长度为4(UltraEdit),而在某些编辑器中,会将制表符转换为空格.
3.5 行长度
尽量避免一行的长度超过80个字符,因为很多终端和工具不能很好处理之。(这是历史原因,以前的Unix,Linux行长度超过80就不读取了,所以,沿用下来。太长也不好看。)
3.6 换行
当一个表达式无法容纳在一行内时,可以依据如下一般规则断开之:
- 在一个逗号后面断开
- 在一个操作符前面断开
- 宁可选择较高级别(higher-level)的断开,而非较低级别(lower-level)的断开
- 新的一行应该与上一行同一级别表达式的开头处对齐
- 如果以上规则导致你的代码混乱或者使你的代码都堆挤在右边,那就代之以缩进8个空格。
以下是断开方法调用的一些例子:
1 someMethod(longExpression1, longExpression2, longExpression3, 2 longExpression4, longExpression5); 3 4 $var = someMethod1(longExpression1, 5 someMethod2(longExpression2, 6 longExpression3));
以下是两个断开算术表达式的例子。前者更好,因为断开处位于括号表达式的外边,这是个较高级别的断开。
1 $longName1 = $longName2 * ($longName3 + $longName4 - $longName5) 2 + 4 * $longname6; //使用这种缩进方式 3 4 $longName1 = $longName2 * ($longName3 + $longName4 5 - $longName5) + 4 * $longname6; //避免这种
以下是两个缩进方法声明的例子。前者是常规情形。后者若使用常规的缩进方式将会使第二行和第三行移得很靠右,所以代之以缩进8个空格
//传统的缩进方式 function someMethod($anArg, $anotherArg, $yetAnotherArg, $andStillAnother) { ... } //利用8个连续空格避免过渡的缩进 function horkingLongMethodName($anArg, $anotherArg, $yetAnotherArg, $andStillAnother) { ... }
if语句的换行通常使用8个空格的规则,因为常规缩进(4个空格)会使语句体看起来比较费劲。比如:
1 //不要使用这种缩进方式 2 if ((condition1 && condition2) 3 || (condition3 && condition4) 4 ||!(condition5 && condition6)) { //错误的换行方式,没有进行缩进 5 doSomethingAboutIt(); //条件与此句对齐,造成阅读程序时很可能漏过此句 6 } 7 8 //应该使用这种缩进方式 9 if ((condition1 && condition2) 10 || (condition3 && condition4) 11 ||!(condition5 && condition6)) { 12 doSomethingAboutIt(); 13 } 14 15 //或者这样的缩进方式也可以 16 if ((condition1 && condition2) || (condition3 && condition4) 17 ||!(condition5 && condition6)) { 18 doSomethingAboutIt(); 19 }
这里有三种可行的方法用于处理三元运算表达式:
1 $alpha = (aLongBooleanExpression) ? beta : gamma; 2 3 $alpha = (aLongBooleanExpression) ? beta 4 : gamma; 5 6 $alpha = (aLongBooleanExpression) 7 ? beta 8 : gamma;
四、注释
4.1 块注释
块注释通常用于提供对文件,方法,数据结构和算法的描述。块注释被置于每个文件的开始处以及每个方法之前。它们也可以被用于其他地方,比如方法内部。在功能和方法内部的块注释应该和它们所描述的代码具有一样的缩进格式。
块注释之首应该有一个空行,用于把块注释和代码分割开来,比如:
1 /* 2 3 * 这里是块注释 4 5 */
块注释可以以/*-开头,这样indent(1)就可以将之识别为一个代码块的开始,而不会重排它。
1 /*- 2 * 如果想被忽略,可是使用特别格式的块注释 3 * 4 * one 5 * two 6 * three 7 */
注意:如果你不使用indent(1),就不必在代码中使用/*-,或为他人可能对你的代码运行indent(1)作让步。
(单行注释就不说了,这都写不好,就转行吧)
4.2 文档注释
文档注释描述php的类、构造器,方法,以及字段(field)。每个文档注释都会被置于注释定界符/**...*/之中,一个注释对应一个类或成员。该注释应位于声明之前:
1 /** 2 * 说明这个类的一些 ... 3 */ 4 class Example { ...
注意顶层(top-level)的类是不缩进的,而其成员是缩进的。描述类的文档注释的第一行(/**)不需缩进;随后的文档注释每行都缩进1格(使星号纵向对齐)。成员,包括构造函数在内,其文档注释的第一行缩进4格,随后每行都缩进5格。
若你想给出有关类、变量或方法的信息,而这些信息又不适合写在文档中,则可使用实现块注释(见5.1.1)或紧跟在声明后面的单行注释(见5.1.2)。例如,有关一个类实现的细节,应放入紧跟在类声明后面的实现块注释中,而不是放在文档注释中。
文档注释不能放在一个方法或构造器的定义块中,因为程序会将位于文档注释之后的第一个声明与其相关联。
五、声明
5.1 每行声明的变量数量
推荐一行一个声明,因为这样以利于写注释。亦即,
1 int $level; // 缩进的程度 2 int $size; // 由制表符决定
要优于,
1 int $level, $size;
不要将不同类型变量的声明放在同一行,例如:
1 int $foo, $fooarray[]; //错误
注意:上面的例子中,在类型和标识符之间放了一个空格,另一种被允许的替代方式是使用制表符:
1 int $level; // 缩进的程度 2 int $size; // 由制表符决定 3 $currentEntry; // 通常选择制表符作为缩进的标准
5.2 初始化
尽量在声明局部变量的同时初始化。唯一不这么做的理由是变量的初始值依赖于某些先前发生的计算。例如:
1 function functionName(){ 2 3 $var = 0;//局部变量初始化 4 5 $var2 = getInt();//局部变量依赖方法getInt,因此不需要初始化。 6 7 8 }
(待续)