Zend Framework 规范.docx
《Zend Framework 规范.docx》由会员分享,可在线阅读,更多相关《Zend Framework 规范.docx(68页珍藏版)》请在冰豆网上搜索。
![Zend Framework 规范.docx](https://file1.bdocx.com/fileroot1/2023-1/21/2a09ae8a-5c44-47c2-b9bf-23b13ffedbf8/2a09ae8a-5c44-47c2-b9bf-23b13ffedbf81.gif)
ZendFramework规范
ZendFramework的开发规范
一、ZendFramework中的Php编码标准
(一)-文件格式
1.对于只含有php代码的文件,我们将在文件结尾处忽略掉"?
>"。
这是为了防止多余的空格或者其它字符影响到代码。
实际上这个问题只有当你不开启压缩或缓存输出时才会出现:
//php.ini-禁止压缩输出及缓存输出
zlib.output_compression=off
output_buffering=off
//foo.php-注意这个时候有一些空格或换行符掉在了"?
>"之后,当然这在页面上是看不到的
php
$foo='foo';
?
>
//index.php-在包含foo.php的同时,实际上我们已经输出了一些空格或换行了
php
include'foo.php';
session_start();
?
>
这时我们将看到一个警告(warning)说"...Cannotsendsessioncachelimiter-headersalreadysent..."这是因为我们在session_start()之前输出了一些看不到的字符。
2.由__halt_compiler()允许的任意的二进制代码的内容,被ZendFramework中的PHP文件或由它们产生的文件所禁止。
实际上这个规定是为了防止一些极个别的情况发生,例如上例中:
//foo.php-我们已经禁用了"?
>"
php
//假如我们想通过__halt_compiler()输出某些东西
if(defined('__COMPILER_HALT_OFFSET__')){
$fp=fopen(__FILE__,'r');
fseek($fp,__COMPILER_HALT_OFFSET__);
var_dump(stream_get_contents($fp));
}
//在程序结束时
__halt_compiler();
则在执行index.php时我们依然会看到警告,而只要把__halt_compiler()注释掉就不会报错了。
需要注意的是__halt_compiler()实际上时语言结构,而非函数或方法。
3.缩进由四个空格组成,禁止使用制表符TAB。
这个主要是为了代码美观整齐。
因为在不同的编辑器里,TAB制表符的长度是不一样的,而空格则是一样的。
实际上这已经成为编写代码的默认标准之一。
例如:
if($x==1){
$indented_code=1;
if($new_line==1){
$more_indented_code=1;
}
}
4.变量赋值必须保持相等间距和排列。
例如:
$variable1="demo";
$var2 ="demo2";
5.每行代码长度应控制在80个字符以内,最长不超过120个字符。
因为linux读入文件一般以80列为单位,就是说如果一行代码超过80个字符,那么系统将为此付出额外操作指令。
这个虽然看起来是小问题,但是对于追求完美的程序员来说也是值得注意并遵守的规范。
例如,下面是在Zend/Navigation.php中的一段代码:
6.每行结尾不允许有多余的空格。
这在很多IDE或者编辑器里都是可以设置的,例如在save保存操作执行时,顺便去掉多余的空格。
7.行结束标志遵循Unix文本文件的约定,行必需以单个换行符"\n"(LF)结束。
换行符在文件中表示为10,或16进制的0x0A。
不要使用苹果操作系统的回车"\r"(0x0D)或Windows系统的回车换行组合如"\r\n"(0x0D,0x0A)。
这个规定没有贬低苹果机或者Windows的意思,而事实确实是,LAMP还是主流,所以遵循其文件约定也是为了在liunx系统上表现更好的性能。
二、
ZendFramework中的Php编码标准
(二)-命名约定
1.类命名总是对应于其所属文件的目录结构。
这源于PEAR命名约定,能让人从类名就能联想到该类的存放位置。
例如:
Zend_Acl_Role就代表Zend/Acl/Role.php文件。
require_once'Zend/Acl/Role/Interface.php';
classZend_Acl_RoleimplementsZend_Acl_Role_Interface
{
......
}
这是规定实际上提供了一种伪命名空间机制,这在php5.3和php6里面都将得到支持,到时候ZendFramework可能会有一翻变革。
2.类名只允许有字母和数字字符,在大部分情况下不鼓励使用数字。
下划线只允许做路径分隔符。
这也源自PEAR命名约定,只不过ZendFramework在其基础上制定了更严格的规定。
例如:
Zend_Db_Table是允许的。
Zend_Db_Table2则是不鼓励的。
Zend-Db-Table是不允许的。
3.当你为其他开发人员提供API接口的时候,如果他们需要用一个复合的名称来确认这个接口,那么你必须把这个名称用下滑线(underline)隔开,而不是使用驼峰的形式。
而且最好是以常量(contant)的形式。
这个规定可能有点难懂,让我们举个例子吧。
例如在实例化Zend_Db_Adapter_xxx实例时,我们通常需要将adapter的名称作为参数传入到Zend_Db:
:
factory()并由该工厂返回所需实例。
我们可以实例化MySQLPDO驱动:
$db=Zend_Db:
:
factory('PDO_MYSQL',$config);
也可以实例化MsSQLPDO驱动:
$db=Zend_Db:
:
factory('PDO_MSSQL',$config);
4.如果类名包含多个单词,每个单词的第一个字母必须大写,连续的大写是不允许的。
例如:
Zend_PDF是不允许的。
Zend_Pdf才是标准写法。
5.有Zend及其合作伙伴开发的ZendFramework类的命名必须总是以"Zend_"作为开头,并放在"Zend/"目录下。
例如:
Zend_Db是由Zend开发的,它通常以“Zend/Db.php”的形式存放。
My_Db则是用户自己定义或继承自Zend_Db的类,所以它不得以"Zend_"作为开头,而且通常以"My/Db.php"的形式存放。
6.接口类(interface)的定义必须遵循类名的定义规范,不同的是必须要以_Interface作为结尾。
例如:
Zend_Controller_Dispatcher_Interface对应的是Zend/Controller/Dispatcher/Interface.php
7.对于文件名,只有字母、数字字符、下划线和短横线("-")可用,空格是绝对不允许的。
例如:
Zend/Controller/Front.php是标准写法。
My/Controller/Common-Action_2.php也是允许的。
My/Controller/CommonAction.php则是禁止的。
8.包含任何PHP代码的任何文件应当以".php"扩展名结尾,视图脚本默认拓展名是".phtml",也可以用".html"等代替。
例如:
Zend/Controller/Front.php是标准php文件写法,index.phtml是默认视图脚本名。
我相信很多人都见过以下的一些php的拓展名:
.php4
.php5
.phpx
.class.php
.include.php
html(开玩笑?
)
而在ZendFramework中你只会见到一种,那就是".php"。
9.函数名只允许由数字或字母组成,下划线是不允许的,首字母要小写,其后每个单词首字母要大写,即所谓的“camelCaps”规则。
例如:
filterInput()
getElementById()
widgetFactory()
等都是规范的写法。
而:
FilterInput3()
getelementbyid()
widget_factory()
等都是不允许的。
10.函数名越详细越好,应该能够描述清楚该函数的功能。
例如:
getOne($id)//描述的不清不楚。
getOneRecordById($id)//则非常详细而清晰。
11.对于对象成员的访问,我们必须始终使用“get”和“set”方法。
例如:
classFoo
{
protected$_testObj;
publicfunctiongetTestObj()
{
return$this->_testObj;
}
publicfunctionsetTestObj($testObj)
{
$this->_testObj=$testObj;
}
}
12.当我们使用了某些设计模式的时候,我们的方法中应该含有该模式名。
例如:
abstractclassZend_Cache
{
//......
publicstaticfunctionfactory($frontend,$backend,
$frontendOptions=array(),$backendOptions=array(),
$customFrontendNaming=false,$customBackendNaming=false,
$autoload=false)
{
//......
}
}
13.当类成员函数被声明为private或者protected时,函数必须以下划线"_"为开头,一般情况下的函数不含下划线。
例如:
classZend_Foo
{
protectedfunction_fooBar()
{
//...
}
}
14.如果我们需要把一些经常使用的函数或方法定义为全局函数,那么应该把它们以静态(static)的形式定义在类中。
例如:
classZend_Debug
{
//......
publicstaticfunctiondump($var,$label=null,$echo=true)
{
//......
}
}
15.在类中被声明为static的函数或变量不应该再被声明为private私有,而应该为protected或者public,如果只是不想被子类继承,则应该用final声明它们。
例如:
classFoo
{
finalpublicstaticfunctionfooFinally()
{
}
}
classBarextendsFoo
{
}
//Thisiswrong
Bar:
:
fooFinally();
//UseFoo:
:
fooFinally()instead
Foo:
:
fooFinally();
16.函数或方法的初始中括号应该在函数声明的下一行顶格。
例如:
functionMyfunction($parameter1)
{
}
17.当函数参数不一定需要被赋值的时候,用"null"来代替"false"作为函数参数的默认值,除非该参数是boolean值。
例如,考虑如下代码:
publicfunctionfoo($required,$optional=null)
{
if(isset($optional)){
echo'Echosomethingonlywhen$optionalissetand!
=null';
}
}
publicfunctionfoo($required,$optional=false)
{
if(isset($optional)){
echo'Alwaysechosomething';
}
}
18.变量只允许由字母组成,数字或下划线都是不允许的。
例如:
$foo//是正确的
$foo_foo//是错误的
$foo2//也是错误的
19.被声明为private或者protected的类成员属性必须由下划线"_"作为开头,这也是唯一一种允许变量中出现下划线的情况,而声明为public的成员属性则在任何时候都不允许含有下划线。
例如:
classZend_Foo
{
private$_barPrivate;
protected$_barProtected;
public$barPublic;
}
20.变量名必须像函数名那样,即首字母要小写,其后每个单词首字母要大写,即所谓的“camelCaps”规则。
例如:
$compatibilityMode
$registryClassName
21.建议用描述性的变量的命名,变量名越详细越好,以至于像$i或$n等等都是不鼓励使用的,特别是在超过20行的循环里面。
例如Zend_Search_Lucene中的一段代码:
//readsegmentInfos
for($count=0;$count<$segments;$count++){
$segName=$segmentsFile->readString();
......
}
22.常量constant必须仅包括字母,数字和下划线,而且必须全部大写,各个单词之间用下划线分割。
例如:
"MY_CONSTANT_ONE"//是允许的
"MYCONSTANTTWO"//是不允许的
"my_constant_two"//也是不允许的
23.常量应该在类中由const声明并定义,全局范围内的define是不鼓励使用的。
例如:
classZend_Acl
{
constTYPE_ALLOW='TYPE_ALLOW';
constTYPE_DENY ='TYPE_DENY';
......
}
24.和php文档说明不一样的是,ZendFramework中的boolean值和null值都是用小写的。
例如Zend_Mail中的一段代码:
publicfunctionsetMessageId($id=true)
{
if($id===null||$id===false){
return$this;
}elseif($id===true){
$id=$this->createMessageId();
}
......
}
三、
ZendFramework中的Php编码标准(三)-编码风格
1.PHP代码必须以完整的形式来定界,短定界符只能用在视图。
例如:
php
//Phpcodehere
?
>
//index.phtml
='hello'?
>
2.当一个字符串是纯文字组成的时候(即不含有变量),则必须总是以单引号(')或者撇号(`)作为定界符。
例如:
$a='ExampleString';
$b=`ExcuteSomething`;
3.当一个字符串含有撇号(`)的时候,我们允许使用双引号(")来定界字符串,特别是在些SQL语句的时候。
例如:
$sql="SELECT`id`,`name`from`people`WHERE`name`='Fred'OR`name`='Susan'";
4.变量替换中的变量只允许用$+变量名的形式。
例如:
$greeting="Hello$name,welcomeback!
"; //允许
$greeting="Hello{$name},welcomeback!
";//允许
$greeting="Hello${name},welcomeback!
";//不允许
5.多个字符串必须用点号"."来连接,且字符串与点号间必须用一个空格隔开。
例如:
$company='Zend'.'Technologies';
6.当用点号"."连接各字符串的时候,我们允许把它分割成多行以增强可读性。
在这种情况下,点号"."必须与等于号"="对齐。
例如:
$sql="SELECT`id`,`name`FROM`people`"
."WHERE`name`='Susan'"
."ORDERBY`name`ASC";
7.任何负数都不允许作为数组的索引,数组索引必须以任何非负数作为开头,而且强烈建议以0作为默认开头。
例如:
$sampleArray=array(-1=>-1,0=>0);//错误
$sampleArray=array(0=>-1,1=>0); //正确
$sampleArray=array(1=>-1,2=>0); //正确
8.当用array类型符号来构造数组的时候,必须在每个逗号之后加上一个空格来增强可读性。
例如:
$sampleArray=array(1,2,3,'Zend','Studio');
9.多行的索引数组同样允许用array类型符号来构造,只是我们需要为每行的每个值加上必要的空格来保持其整齐美观。
例如:
$sampleArray=array(1, 2, 3, 'Zend',
'Studio',$a,$b,$c,
56.44, $d,500);
10.当使用array类型符声明关联数组的时候,我们鼓励把它分成多个行,只是我们必须同时保证每行的键与值的对齐,以保持美观。
例如:
$sampleArray=array('firstKey' =>'firstValue',
'secondKey'=>'secondValue');
11.中括号的开始必须在类名的下一行顶格。
例如:
classfoo
{
//正确{}写法
}
classfoo{
//错误{}写法
}
12.类定义必须拥有符合phpDocumentor标准的注释块。
例如:
/**
*类定义注释
*/
classZend_Class
{
}
13.类中的所有代码都必须用4个空格来进行缩进。
例如:
classZend_Class
{
$spaces='4spaces';
if($spaces=='4spaces'){
echo'ispermitted!
';
}
}
classZend_Class
{
$spaces='lessthen4spaces';
if($spaces!
='4spaces'){
echo'isnotpermitted!
';
}
}
14.每个php文件只允许声明一个类。
在类文件里面写其它代码是允许的,但并不鼓励这样做。
假如真要附加代码的话,必须用空行来分隔。
例如:
php
//允许但并不鼓励这样做
classZend_Class
{
static$foo='foo';
}
echoZend_Class:
:
$foo;
php
/**
*在同一文件里声明超过两个类是不允许的
*/
classClass_One
{
}
classClass_Two
{
}
?
>
15.任何类变量的声明都必须放在类顶部,先于任何函数的声明。
例如:
//正确
classright
{
public$foo='先于函数定义';
publicfunctionfun()
{