本文档是对PHP开发的规范性提供指导和建议,主要内容包括:
l PHP文件格式要求
l 命名规范
l 编码风格规范
l 代码内文档化要求
编码规范对于任何一个开发项目都是很重要的,尤其是多人协作的情况,良好的编码规范意味着代码高质量、较少bug,以及易于维护。
对于只包含PHP代码的文件,不允许使用PHP结束标签(”?>”),尽管PHP语法并不要求必须这么做,但去掉这个结束标签,可以避免尾部的空白字符意外输出,造成不必要的影响。
重要:虽然在PHP里可以通过 __HALT_COMPILER() 来包含任意的二进制数据,但在本规范里禁止这么做,只有在某些安装了特殊脚本的情况下才允许这么做。
缩进的时候使用4个SPACE字符(键),不要使用TAB字符(键)。
每行不要超过80个字符,即,在实际开发过程中每行的代码尽量不要超过第80列这个边界,稍微超过也可以,PHP代码每行最大字符数是120。
行结束符采用UNIX文本文件标准,即每行以“换行符(LF)”结束,在ASCII码中,换行符是的十进制值为10,十六进制值为0x0A。
不要使用Macintosh系统的标准:以回车符(CR,十六进制值是0x0D)为行结束符。
也不要使用 Windows系统的标准:以回车 /换行( CRLF, 0x0D, 0x0A)为行结束符。Zend Framework引入了一种层级类命名方法,可以通过类的名称直接映射到该文件实际存储的目录。在这个层级结构中,Zend Framework的根目录是"Zend/",所以的类文件都按一定目录层次分别保存。
类的名称只能包括字母和数字,但不推荐使用数字。下划线只能用于替换路径分隔符的情况,比如文件名"Zend/Db/Table.php"会映射到类的名称"Zend_Db_Table"。
如果类的名称由多个单词组成,那么每个单词的首字母都必须大写,其他字母小写,例如类名"Zend_PDF"是不允许的,应该命名为"Zend_Pdf"。
Zend Framework中由Zend公司(或者参与Zend Framework开发的合作伙伴公司)发布的类,其名称总是以"Zend_"开头,其相应的文件保存在层级目录"Zend/"中。
规范的类命名的例子:
Zend_Db
Zend_View
Zend_View_Helper
重要: 在项目开发中不属于Zend框架的代码,例如由框架使用者自己开发代码,类的命名一定不要以"Zend_"开头,只有Zend公司(或参与Zend Framework开发的合作伙伴公司)发布的类,才能使用”Zend_”命名。
接口类的命名规则与其他类的命名规则类似(参看上节),只是最好必须以单词"Interface"结尾,举例如下:
Zend_Log_Adapter_Interface
Zend_Controller_Dispatcher_Interface
对于所有文件,只有字母、数字、下划线和短划线("-")可以使用,不允许使用空格和其他特殊字符。
只要是包含有PHP代码的文件都必须以".php"为文件名后缀,下面是一些规范的文件命名的例子,这几个例子与上一节类命名的例子相对应。
Zend/Db.php
Zend/Controller/Front.php
Zend/View/Helper/FormRadio.php
正如上面的例子,文件命名与类命名必须一致。
函数名只能包含字母和数字字符,不允许使用下划线,虽然允许使用数字,但并不提倡。
函数名必须以小写字母开始。如果函数名包含多个单词,那么除了第一个单词,其他单词的首字母都大写,这就是通常所称的骆驼法则("studlyCaps"或"camelCaps")。
为增强代码的可读性,允许命名一定程度的详细和冗长。
下面是一些合乎规范的函数命名的例子:
filterInput()
getElementById()
widgetFactory()
对于面向对象编程,对象的存取器总是以"get"或"set"为前缀;当使用设计模式时,比如singleton或工厂模式(factory),方法的命名通常会包含模式的名称,这样可增强代码可读性,并且能一目了然的知道采用了何种设计模式。
本规范不允许有全局范围的函数(即游离于对象之外的函数),这些函数应该包装进一个静态类。
变量名只能包含字母和数字字符,不允许使用下划线(对于下面的情况例外),同样,数字也是允许但不提倡的。
对于声明为private或protected的类成员变量,变量名必须以一个下划线开头,这也是变量命名规则中唯一允许使用下划线的情况,而声明为public的成员变量则不允许使用下划线。
与函数命名规则(参看3.3节)一致,变量命名必须以小写字母开始,而之后的单词,遵循首字母大写的骆驼法则(camelCaps)。
为了增强可读性,变量命名同样需要一定程度的详细和冗长,并且要有实际意义。类似于$i、$n这样的变量命名,除了用于较少代码的循环语句,在其他情况下是不允许的。如果循环语句超过20行代码,那么用于循环的索引变量也应该使用有意义的名字。
常量名允许使用字母和数字字符,与函数命名和变量命名等不同的是,他也允许使用下划线,对数字的使用也没有限制。
常量的所有字母都必须大写。
常量必须使用 const指示符定义为类成员,在全局范围使用 define定义常量虽然允许,但也不提倡。PHP代码定界符必须使用完整的标准的PHP定界标签:
<?php
?>
禁止使用短标签。
对于纯文字字符串(不包含变量替代),必须使用单引号包含:
$a = 'Example String';
对于包含有引号的纯文字字符串,允许使用双引号来包含,这种方式多用于SQL语句的书写:
$sql = "SELECT `id`, `name` from `people` WHERE `name`='Fred' OR `name`='Susan'";
上面的书写方法比使用转义符加引号更加清晰,可读性强。
对于含有变量替代的字符串,以下两种方式都是允许的:
$greeting = "Hello $name, welcome back!";
$greeting = "Hello {$name}, welcome back!";
为了书写的连贯性,以下方式是不允许的:
$greeting = "Hello ${name}, welcome back!";
多个字符串可以使用点操作符(".")连接,但点操作符前后必须各有一个空格,目的是增强可读性。
$company = 'Zend' . 'Technologies';
当使用点操作符连接多个字符串时,可以把语句拆分成多行来增强可读性,对于这种情况,每个后续行应该使用空格填充,使点操作符刚好对齐在等号下面:
$sql = "SELECT `id`, `name` FROM `people` "
. "WHERE `name` = 'Susan' "
. "ORDER BY `name` ASC ";
数组的索引不允许使用负数。
索引数组可以使用任何非负整数开始,但并不提倡这么做,建议每个数组都应该使用索引0开始。
当使用array关键字定义索引数组时,每个逗号后面都应该跟随一个空格字符,目的是增强可读性:
$sampleArray = array(1, 2, 3, 'Zend', 'Studio');
使用array关键字定义索引数组的语句可以拆成多行,这种情况下每个后续行都应该使用空格填充头部,使每行以如下的形式保持对齐:
$sampleArray = array(1, 2, 3, 'Zend', 'Studio',
$a, $b, $c,
56.44, $d, 500);
当使用array关键字定义关联数组时,建议把语句拆分成多行,对于这种情况,应该使用空格使每一行的键和值分别对齐:
$sampleArray = array('firstKey' => 'firstValue',
'secondKey' => 'secondValue');