{
echo $a, '不大于', $b; }
/*错误*/ if($a > $b)
echo $a, '大于', $b; else
echo $a, '不大于', $b; /*推荐*/
echo ($a > $b) ? $a.'大于'.$b : $a.'不大于'.$b;
在if结构中,if和else if与前后两个圆括号同行。推荐大括号“{”和右括号\间有一个空格。左右两个括号,与括号内的代码是紧贴的,没有空格。另外,即便if后只有一行语句,仍然需要加入大括号,以保证结构清晰。(注:在if结构中,没有关键词elseif,只有else if)。
对于简单的if结构,推荐使用三元符(? :),减少代码编写。当有三个或三个以上的条件判断时,尽可能的使用switch()结构来处理。
在switch结构中,通常当一个case块处理后,将跳过之后的case块处理,因此大多数情况下需要添加break。break的位置视程序逻辑,与case同在一行,或新起一行均可,但同一switch体中,break的位置格式应当保持一致。\语句中应该总是包括 \控制。
例如:
switch ($var) {
case 1: echo ‘var is 1’; break; case 2: echo ‘var is 2’; break;
default: echo ‘var is neither 1 or 2’; break; } 或
switch ($var) {
case 1: echo ‘var is 1’; break;
case 2: echo ‘var is 2’; break;
default: echo ‘var is neither 1 or 2’; break; }
(2)循环语句(foreach, for): 在循环语句中,只要有可能就采用foreach()结构(在使用foreach结构之前最好对所要进行遍历的数组进行is_array()的判断,以防对非数组类型的变量报错)。
foreach结构和for结构的编码规范与上文if结构的编码规则相同。 例如:
foreach($data as $key=>$value){ echo $key, ':', $vaule;
6
}
在for()结构时,循环计数器允许使用一个单字符变量的唯一情形是当它作为一个循环结构的计数器的时候。在这种情况下,外层循环的计数器应当始终是 $i。如果有一个循环处于那个循环的内部,它的计数器应当是 $j,继而是 $k,等等。如果这个循环是用某个已经存在并且具备有意义的名字的变量计数的,本规范并不适用。
例如:
for($i=0; $i<23; $i++){ ...
for($j=1; $j=5; $j++){ ... } ... }
3.6、运算符:
运算符之间使用空格,这是不用太多努力而保持代码可读性的另一个简单,容易的步骤。 无论何时你写一个赋值,表达式,等等,始终在符号之间保留一个空格。基本上,把代码当作英语来写。在变量名和运算符之间插入空格。不要在左括号“(”后或者右括号“)”前加空格。不要在逗号或者分号之前加空格。
例如:
/* 每一对给出了错误方式,紧跟正确方式*/ $i=0; $i = 0; if($i<7) ... if ($i < 7) ...
if ( ($i < 7)&&($j > ) ... if (($i < 7) && ($j > ) ... do_it( $i, \do_it($i, \
for($i=0; $i<$size; $i++) ... for($i = 0; $i < $size; $i++) ... $i=($j < $size)?0:1; $i = ($j < $size) ? 0 : 1;
对于运算符优先级,始终通过用括号强制一个表达式的优先级来使优先级明显。 例如:
/* 结果是什么?谁知道? */
$bool = ($i < 7 && $j > 8 || $k == 4); /* 现在你确定这里我在做什么了。 */ $bool = (($i < 7) && (($j < || ($k == 4))) 3.7、连接符:
多个字符串必须用点号 \来连接,且字符串与点号间必须用一个空格隔开。为了增强代码的可读性,我们推荐当用点号 \连接各字符串的时候,我们允许把它分割成多行以增强可读性。在这种情况下,点号 \必须与等于号 \对齐。
例如:
$sql = \
7
. \ . \3.8、简化运算符:
自增($i++)和自减($i--)运算符 /* 错误 */
$array[++$i] = $j; $array[$i++] = $k; /* 正确 */ $i++;
$array[$i] = $j; $array[$i] = $k; $i++;
/* 允许 */ $i = $i + 3; /* 推荐 */ $i += 3;
3.9、SQL 语句:
所有SQL语句中,除了表名、字段名称以外,全部语句和函数均需大写,应当杜绝小写方式或大小写混杂的写法。
对于很长的SQL语句不要尝试去做诸如在 SQL 代码中实现列对齐此类的麻烦事。推荐把语句断行到它们单独的行上去,注意在哪里断行,大写,和括号的用法。
例如:
SELECT field1 AS something, field2, field3 FROM table a, table b
WHERE (this = that) AND (this2 = that2)
SQL insert 语句:SQL INSERT 语句可以写成两种不同方式。或者你明确说明要被插入的行,或者你已经知道数据中各行的顺序并且不用详细指定它们。我们希望使用前一种方法,也就是详细说明哪些行将被插入。这意味着我们的应用程序级代码不会依赖于数据库中字段的顺序,也不会因为我们增加另外的字段而崩溃(当然,除非它们被指定为 NOT NULL)。
例如:
/*这不是我们想要的*/ INSERT INTO mytable
VALUES ('something', 1, 'else') /*这是正确的*/
INSERT INTO mytable (column1, column2, column3) VALUES ('something', 1, 'else')
在SQL语句中,所有数据都不得加单引号,但是在进行sql查询之前都必须经过intval函数处理;所有字符串都必须加单引号,以避免可能的注入漏洞和SQL错误。正确的写法为:
$catid = intval($catid);或 $catid = (int)$catid;
SELECT * FROM phpcms_member WHERE username=’$_username’ AND catid=$catid; 所有数据在插入或更改数据库之前,均需要进行addslashes()处理,以免特殊字符未经转义在插入数据库的时候出现错误(如果进行model操作,model的insert与update方法则会自动进行addslashes()处理)。
8
注:调用SQL语句时,SQL语句要加双引号。 例如:
$sql = \
$update_sql = \3.10、函数定义: 左大括号“{”必须与函数名同行。推荐“{”与函数名间隔一空格,这样代码更加清晰。函数定义中的左小括号,与函数名紧挨,中间无需空格。
函数参数的名字和变量的命名规范一致,参数必须用逗号+空格来分隔。具有默认值的参数应该位于参数列表的后面,若具有默认值的参数数据类型不为boolean时,默认值为空时不允许用false,而是用null。
引用只允许定义在函数参数中,实时传递引用是禁止的。其实“&”引用,我们是非常不推崇的,这样在阅读代码,理解代码时无端地增加了难度。
左右小括号\与参数紧贴,不允许有空格。函数返回值不可以用括号包住,为什么这样做,让我们难以理解,这样做除了增加阅读代码时不必要的麻烦外,没有其它益处。如外必须仔细检查并切实杜绝函数起始缩进位置与结束缩进位置不同的现象。
/* 正确 */
function 函数名(参数1, 参数2, 参数3) { .... }
/* 错误 */
function 函数名(参数1,参数2,参数3){ .... }
注:调用函数时,参数同样也必须用 逗号+空格 来分隔。 3.11、类的定义:
左大括号\必须与类名同行,且与类名间隔一空格。 /*正确*/ class demo { ... }
/*错误*/ class demo { ... }
类定义必须拥有符合 phpDocumentor 标准的注释块。 例如: /**
* 类定义注释 */
class DoitClass { }
任何类变量的声明都必须放在类顶部,先于任何函数的声明。
不允许用 var 符号来声明变量,类成员变量必须以 private,protected 和 public 来声
9
明。
其次,把类成员声明为 public 而直接引用虽然是允许的,但通常更好的方法是使用 get 和 set 方法来访问类成员。作用域为private,protected的变量,推荐变量名以“_”开始。例如:private $_vars;
方法必须总是用 private,protected 或者 public 来声明其作用域。静态 static 方法也应该声明其作用域。
方法的编码规范与函数的规范相同,可以参考上文提及的函数的编码规范。
五、数据库设计 1.字段
1.1. 表和字段命名
表和字段的命名以上文的命名约定为基本准则。
所有数据表名称,只要其名称是可数名词,则必须以复数方式命名,例如:doit_member(用户表);存储多项内容的字段,或代表数量的字段,也应当以复数方式命名,例如:hits(查看次数)、items(内容数量)。
当几个表间的字段有关连时,要注意表与表之间关联字段命名的统一,如doit_article_1表中的articleid与doit_article_data_1表中的articleid。
代表id自增量的字段,通常用以下几种形式:
一般情况下,使用全称的形式,例如userid、articleid;
没有功能性作用,只为管理和维护方便而设的id,可以使用全称的形式,也可只将其命名为id。
篇幅所限,无法一一赘述,但所有与表、字段相关的命名,请务必大量参考doit现有字段的命名方式,以保证命名的系统性和统一性。
1.2. 字段结构
允许NULL值的字段,数据库在进行比较操作时,会先判断其是否为NULL,非NULL时才进行值的必对。因此基于效率的考虑,所有字段均不能为空,即全部NOT NULL;
预计不会存储非负数的字段,例如各项id、发帖数等,必须设置为UNSIGNED类型。UNSIGNED类型比非UNSIGNED类型所能存储的正整数范围大一倍,因此能获得更大的数值存储空间;
存储开关、选项数据的字段,通常使用tinyint(1)非UNSIGNED类型,少数情况也可能使用enum()结果集的方式。tinyint作为开关字段时,通常1为打开;0为关闭;-1为特殊数据,例如N/A(不可用);高于1的为特殊结果或开关二进制数组合(详见doit中相关代码);
MEMORY/HEAP类型的表中,要尤其注意规划节约使用存储空间,这将节约更多内存。例如cdb_sessions表中,就将IP地址的存储拆分为4个tinyint(3) UNSIGNED类型的字段,而没有采用char(15)的方式;
任何类型的数据表,字段空间应当本着足够用,不浪费的原则,数值类型的字段取值范围见下表:
字段类型 存储空间(b) UNSIGNED 取值范围 tinyint 1 否 -128~127 是 0~255
smallint 2 否 -32768~32767 是 0~65535
mediumint 3 否 -8388608~8388607 是 0~16777215
10