i++,j++){
...//programcode
}
第2章命名规范
2.1变量命名
规范使用三种书写方式:
Pascal命名规则
将标识符的每个单词的首字母都大写。
ps:
类命名与类的方法命名
例如:
BackColor
Camel命名规则
标识符的首字母小写,而后面连接的单词的首字母都大写。
ps:
方法内部变量命名,(函数外部参数命名)
例如:
backColor
LinuxC命名规则
变量所有字母都使用小写,使用'_'作为每个词的分界。
ps:
函数内部变量命名
变量名必须有一定的意义,并且意义准确。
例如:
有一个变量用于保存图书的数目,可以命名为number_of_book或者num_of_book。
不建议使
用i,j,n等,因为它没有意义。
也不建议使用number或book,因为意义不准确。
2.1.1局部变量
所有变量都要预先声明,并注明其意义,在函数的首部定义所有的变量。
不要使用一个声明一个;
最好把每个变量的声明语句单独放到一行,并加上注释说明。
所有变量按照字母排序。
$current_entry;//当前选择项
//缩进程度
$level;
$size;
//表格大小
尽量减少全局变量的使用。
不要让局部变量覆盖全局变量。
局部变量所有字母都使用小写,使用'_'作为每个词的分界。
实参并不认为是局部变量。
理由:
通过这一途径,代码中变量的作用域是清晰的。
所有的变量在代码中都看起来不同,容易辨认。
例如:
functionHandleError($errorNumber){
$error
=osErr($errorNumber);
$time_of_error
=osErr->GetTimeOfError();
$error_processor=osErr->GetErrorProcessor();
}
变量名字应该使用名词或者形容词+名词的方式。
如$value,$new_value。
2.1.2全局变量命名
全局变量使用g前缀。
例:
global$gLog;
global&$rgLog;
2.1.3静态变量命名
静态变量使用s前缀,如:
$s_value。
2.1.4引用变量和函数返回引用
引用必须带‘r’前缀
理由:
使得类型不同的变量容易辨认,它可以确定哪个方法返回可更改对象,哪个方法返回不可更改对象。
如:
$r_var。
function&rStatus(){};
ps:
关于用返回引用来加快运行速度一说,有文章指出并不明显。
2.1.5临时变量命名
不要将在循环中频繁使用的临时变量如$i,$j等用于其它用途。
2.1.6方法中参数命名
参数的名字使用Camel命名方法(首字母小写)
在首字符后的所有字都按照类命名规则首字符大写。
参数的名字应该是描述性的,参数的名字应该具有自描述性,也就是说参数的名称可以描述参数在大多数
情况下的含义,参数的类型也是可以从参数的名字推断出来的。
参数的名字是基于参数的含义而不是参数
的类型。
理由:
可以区分方法中的一般变量。
你可以使用与类名相似的名称而不至于产生重名冲突。
例如:
classNameOneTwo{
functionStartYourEngines(&$rSomeEngine,&$rAnotherEngine);
}
2.2命名定义/全局常量
全局常量所有字母都大写,用'_'分隔每个单词。
理由:
这是命名全局常量的传统。
你要注意不要与其它的定义相冲突。
例如:
define("HELLO_WORLD","Helloworld!
");
2.3类命名
用Pascal命名规则,也就是用英文的大小写来分隔单词,包括首个单词,所有单词的首字母大写,如
PageManager;
尽量谨慎的使用缩写,不要用下划线作类名单词连接符。
在类中,方法放到属性定义前边、公用方法放到专用方法前边。
在为类命名前首先要知道它是什么。
如果通过类名的提供的线索,你还是想不起这个类是什么的话,那
么你的设计就还做的不够好。
超过三个词组成的混合名是容易造成系统各个实体间的混淆,再看看你的设计,
尝试使用(CRCSession
card)看看该命名所对应的实体是否有着那么多的功用。
对于派生类的命名应该避免带其父类名的诱惑,
一个类的名字只与它自身有关,
和它的父类叫什么无关。
有时后缀名是有用的,例如:
如果你的系统使用了代理(agent)那么就把某个部件命名为,
“下载代理”
(DownloadAgent)用以真正的传送信息。
一般情况下,一个类对应到一个文件,当一些类关系紧密时,可以存放在一个文件中。
存放类的文件采
用classname.class.php方式命名。
所有系统文件名均为小写。
2.3.1接口命名原则
接口名字在类的原则上加前缀I。
例如:
IComponent(描述性名词)、ICustomAttributeProvider(名词短语)、IPersistable(形容词)
等。
有的类,必须用字母I作为类名前缀,而又不是一个接口。
这是可以接受的,因为有的类名就是I开头
的,例如:
IdentityStore。
这种情况和接口的区别在于其第二个字母是小写的。
有的时候,定义完一个接口之后,也会定义一个类作为接口的标准实现。
该类和该接口应该有类似的名
字,唯一的区别就是接口名称前缀为字母I。
如:
IComponent和它的标准实现classComponent{}。
2.3.2Exception命名原则
异常的命名以“Exception”为后缀。
2.3.3类库命名
目前命名空间正在越来越广泛的被采用,以避免不同厂商和团体类库间的类名冲突。
当尚未采用命名空间的时候,为了避免类名冲突,一般的做法是在类名前加上独特的前缀,两个字符就
可以了,当然多用一些会更好。
例如
JohnJohnson的数据结构类库可以用Jj做为前缀,如下:
classJjLinkList{}
另一种折中方式是建立包含类库目录
(事实上Java也是这么做的)以不通的目录代表不同的命名空间。
例如:
Microsoft的数据库相关类库可以在:
/classes/com/Microsoft/Database/DbConn.php
Apache的数据库相关类库可在:
/classes/org/apache/Database/DbConn.php
2.3.4方法命名
采用与类命名一致的规则
理由:
使用所有不同规则的大部分人发现这是最好的折衷办法。
ps:
这种方法和PHP并不像但是和java匹配,而又与js/C#类似,程序界够乱套的。
例如:
classNameOneTwo{
functionDoIt(){};
functionHandleError(){};
}
2.3.5方法/函数命名修饰
通常每个方法和函数都是执行一个动作的,所以对它们的命名应该清楚的说明它们是做什么的:
用
CheckForErrors()代替ErrorCheck(),用DumpDataToFile()代替DataFile()。
这么做也可以使功能和
数据成为更可区分的物体。
方法使用英文的大小写来分隔单词,命名建议使用动词+名词的方式,单词的首字母大写。
不要采用不常
用的缩写,如Where2Go();使用常用的缩写时,只大写首字母,如GetHtml()。
有时后缀名是有用的:
Max-含义为某实体所能赋予的最大值。
Cnt-一个运行中的计数变量的当前值。
Key-键值。
例如:
RetryMax表示最多重试次数,RetryCnt表示当前重试次数。
有时前缀名是有用的:
Is-含义为问一个关于某样事物的问题。
无论何时,当人们看到Is就会知道这是一个问题。
Get-含义为取得一个数值。
Set-含义为设定一个数值
r-小r前缀用于修饰返回引用的地方法与函数。
例如:
$IsHitRetryLimit。
function&rStatus(){};
functionDoSomething(&$rStatus){};
2.3.6类属性命名
使用英文名词、动词,以大写字母作为词的分隔,其他的字母均使用小写,单词的首个字母
使用大写,不使用下划线,对于类属性为某个对象变量,则以字符串Object为后缀,例:
classUserAccount{
$TableName
='';
$DatabaseObject='';
}
2.3.7私有属性与私有方法命名
以_开头,如private$_PrivateValue;
privatestatic$_sPrivateStaticValue;
privatefunction_Initialize(){...};
2.3.8对象命名
使用类名称为变量前缀,所有字母都使用大写,以字符串_obj为后缀,
例:
$input_obj=newInput;
ps:
经测试发现如果遇到比较长的类名的话精简变量名字是有必要的,
前提是一眼就能看出名字的意义,
变量过长的命名感觉导致书写困难,也影响程序可读性。
例:
$front_obj=JdFrontController:
:
getInstance();
2.4缩写词不要全部使用大写字母
无论如何,当遇到以下情况,你可以用首字母大写其余字母小写来代替全部使用大写字母的方法来表示
缩写词。
使用:
GetHtmlStatistic.
不使用:
GetHTMLStatistic.
理由:
当命名含有缩略词时,人们似乎有着非常不同的直觉。
统一规定是最好,这样一来,命名的含义就完全可以
预知了。
举个NetworkABCKey的例子,
注意C是应该是ABC里面的C还是key里面的C,
这个是很令人费解的。
有些人不在意这些,其他人却很讨厌这样。
所以你会在不同的代码里看到不同的规则,使得你不知道怎么
去叫它。
例如
classFluidOz//不要写成FluidOZ
classGetHtmlStatistic//不要写成GetHTMLStatistic
ps:
不过有时也要是情况而定,如PDO类库本身全大写,那么classMyPDOextendsPDO{...}也就
说得过去了,如果PDO小写有可能起反作用,主要目的在于容易理解,而不是做样子。
2.5函数命名
函数名字采用CGNU的惯例,所有的字母使用小写字母,使用'_'分割单词。
理由:
这样容易区分类方法?
ps:
此条有待研究,函数与方法区分微小,人为扩大区分不会起到反作用么?
调用的时候明显的->操作
方还不够清晰么?
例如:
functionsome_bloody_function(){}
完成一组功能的函数放到一个文件中,存放函数的文件采用name.func.php命名。
第3章版式规则
3.1语义分隔
各个函数、方法之间应该采用空行间隔;ps:
}结束大括号要有空行
同一个函数中联系紧密的语句之间可以不换行,其他情况需要换行。
3.2圆括号规则
函数名与括号之间不需要加空格、语法关键字后的括号必须加空格。
正确for($i=0;$i<10;$i++)
strlen($my_name);
错误for($i=0;$i<10;$i++)
strlen($my_name);
3.3方法/函数
函数名与((左括号)之间不应该有空格。
)(右括号)与开始程序体的{(左大括号)之间应插入一个空格。
函数程序体应缩进四个空格。
}(右大括号)与声明函数的那一行代码头部对齐。
functionouter($c,$d){
$e=$c*$d;
functioninner($a,$b,$e){
return($e*$a)+$b;
}
returninner(0,1,$e);
}
如果函数是匿名函数,则在function和((左括号)之间应有一个空格。
如果省略了空格,否则会让人感觉函
数名叫作function。
$a=function($e){
return$e;
};
3.4关键字
if、for、do、while、case、switch、default等语句自占一行,且if、for、do、while等语句的执行
语句部分无论多少都要加括号{}。
示例:
如下例子不符合规范:
if(NULL==$rUserCR)return;
应如下书写:
if(NULL==$rUserCR){
return;
}
if这个规范是最容易出错的地方,不规范的写法在程序重构或修改的时候很容易造成疏忽。
3.4.1if语句
if语句应如以下格式:
if(condition){
statements;
}
if(condition){
statements;
}else{
statements;
}
if(condition){
statements;
}elseif(condition){
statements;
}else{
statements;
}
3.4.2for语句
for语句应如以下格式:
for(initialization;condition;update){
statements;
}
3.4.3while语句
while语句应如以下格式:
while(condition){
statements;
}
3.4.4do语句
do语句应如以下格式:
do{
statements;
}while(condition);
不像别的复合语句,do语句总是以;(分号)结尾。
3.4.5switch语句
switch语句应如以下格式:
switch(expression){
caseexpression:
statements;
default:
statements;
}
每个case与switch对齐。
这可避免过分缩进。
每一组statements(除了default应以break,return,或者throw结尾。
不要让它顺次往下执行。
3.4.6try语句
try语句应如以下格式:
try{
statements;
}catch(variable){
statements;
}
3.4.7return语句
一条有返回值的return语句不要使用()(括号)来括住返回值。
如果返回表达式,则表达式应与return关
键字在同一行,以避免误加分号错误。
第4章编程规范
系统统一使用时间戳time()作为时间标志,写入mysql时使用INT(10)类型写入,读取时可以使用公
共函数库中的getdate()将时间戳转换为标准时间格式;
引号统一使用'单引号,只有当引号重叠时才使用"双引号,这样每进程可以节省几百K内存;
统一使用
php?
>,禁止使用
?
>格式。
4.1数组定义规则
数组定义和使用时中key值前后必须加单引号。
//正确
array(
'name'
'gender'
);
=>'',
=>'php'
//错误
array(
=>'',
name
gender=>'php'
);
4.2不要采用缺省方