1.变量命名与类的命名
(1) 类型 + 变量名: $inum
基于PHP语言弱类型的特色,以匈牙利命名法为参考,但国人不习惯大写字母,因此纯小写,为基本规范。
一个类型字符+命名的方式,好比 $susername
s表明字符串,i表明整型,a表明数组,o表明对象, r表明资源, b布尔型, d日期,例子:
php
$inum = 55;
mysql
$itotal = 110;
程序员
$susername = 'root';
sql
$spassword = '123456';
数据库
$rlink = mysql_connect('localhost', 'root', '123456');
数组
$odb = new dbstuff();
缓存
$anumber = array(1, 2, 3, 4, 5);
服务器
$ddate = '2010-06-04';iview
特殊经常使用的少数变量,能够不用书写前缀,好比:
$uid, $sid, $sql, $row, $db, $i, $j, $k, $v或者$key, $value
这种书写方式缺点:略需一点适应成本,但习惯后对程序员的类型思惟有帮助,对团队开发和代码阅读调试意义重大。
(2) 经常使用的命名及数据库设计字段类型及长度字符串类型通常没有默认值,而非主键的数值类型,非空,默认值为0。
username 用户名, char(16)
password 密码, char(32)
email 邮件, char(50)
dateline 时间,int(10)
register 注册
login 登录
adminid 管理员id, 某某id的命名,采用 名字+id的方式,
好比groupid,
经常使用的id可用缩写替代:好比
uid 用户id, mediumint(8)
sid SESSION id
displayorder 文章或类别现实顺序 smallint(6), -2为未审核, -1 忽略, 0以上为正常顺序。
基本规范摘取了Discuz设计数据库的用法,效率是有目共睹的。
(3) 表示总数的命名,请用复数形式,如:
$iviews 总浏览数
$ireplies总回复数
$iclicks总点击数
(4) 表示权限判断的命名,请在前面附加allow,如
$ballowview
$ballowpost
$ballowvisit
(5) 常规变量定义通常不使用下划线_,中划线- 和大写字母,特殊字符等。
(6) 类名
类名在使用中常常遇到命名空间的问题,所以,类名的命名规范除了要遵循普通命名规则之外,还需在类名前附加产品和所属模块名称。
该名称最好与表名前缀一致。如:
例如:
数据库设计
class cdb_trade_cart {
……
}
(7) 字段名采用匈牙利命名法的好处:
程序中出现SQL语句时,陌生字段基本不用去查看表结构。
如:
susername,
spassword,
idateline
2. 书写细节规范
(1) 空格:
A. 等号或其余运算符两边各有一个空格,好比
$inum = 55;
$inum = 55 + 66;
B. 并列的各项中间用逗号分隔,其后要有一个空格。如:
array(1, 2, 3)而非array(1,2,3)
C. if语句中,if关键字后没有空格,而小括号的条件以后有空格,好比
if($inum == 55) {
……
}
(2) 断行,若是语句过长(默认为80字符)时,须要断行譬如:
array(
'a' => '这是一个字符串',
'b' => '这是第二个字符串',
'c' => '这是第三个字符串'
)
(3) 缩进
以4个空格为一个缩进单位为准。
两种方案:
A. 统一用Tab键,在代码书写完发布前,用编辑器功能统一替换为4个空格
B. 手动敲4个空格,或者编辑器功能自定义
(4) 大括号与小括号
大括号的两种方案:
A.
if() {
……
} elseif() {
……
} elseif() {
……
} else {
……
}
B.
if()
{
……
}
elseif()
{
……
}
else
{
……
}
小括号,在运算符优先级容易产生混淆的地方,必须用小括号括起来,在变量拼接时,若是出现某个变量值做为字符串的一部分,或者模板中复杂嵌套,要用大括号{}括起来。
如 $sql = "SELECT uid FROM {$tablepre}members";
或 模板中:{$aarray[$key][sec]}
(5) 单引号,双引号与SQL
尽可能使用单引号,好比
$susername = 'root';
在写数组的索引时,必须使用单引号:
如 $alist['key']的方式,而不是$alist[key]。
单双引号的嵌套组合,SQL语句(关键字需大写)拼接的推荐写法。字段名可以使用``号区隔。
A. $sql = "SELECT `uid` FROM {$tablepre}members WHERE `username` = '$gsusername' LIMIT 1";
外层是双引号,因此里面在单引号内的变量可以解析。
单引号代表里面的值是个字符串。
这样的拼接方式好处在于易读性。
B. $sql = 'SELECT `uid` FROM '.$tablepre.'members WHERE `username` = \''.$gsusername.'\' LIMIT 1';
这样书写的好处是效率会高点,可是语句比较不易读,须要转义字符,稍微繁复。
其余经常使用拼接:
HTML时,$sform = '<input type="text" name="username" />';
3. 程序语句段书写规范
(1) 先按前后依赖关系分顺序,再按功能分隔语句段。
如关于 $sid 有50行语句段A,前面依赖通用功能定义。
那么通用功能定义语句应在A段代码以前。
A段代码,和其余功能段代码,都应该成块状。
好比500行文件,可分为段A、B、C、D、E等。
各段之间用两个空行区隔开
(2) 功能段内部语句段顺序
A. 变量赋初值
B. 肯定主要功能逻辑段所用到的变量值
C. 主功能逻辑段
D. 返回、输出或其余操做
(3) 后台管理功能块或其余功能块的基本划分:
A. 用表单的提交元素判断切分开逻辑层与表现层
如 <input type="submit" name="registersubmit" />
那么,在代码中经过
$pssubmit = $_POST['registersubmit'];
if(empty($pssubmit)) {
//表现层代码
} else {
//逻辑层代码
}
B. 逻辑层可经过表现层的输入表单元素的name 值来区隔开增删查改。
如<input type="text" name="gender[]" value="" />,则判断数组$pagender是否有值来进行更改操做
<input type="checkbox" name="delete[]" value="" />, 则判断数组$padelete是否有值来进行删除操做
……
(4) 循环体
A. 在循环体内,不容许出现重复计算。
如:
$sstring = 'abcdef';
//低效率的写法
foreach($i = 0; $i < strlen($sstring); $i++) {
……
}
//高效写法应该是:
$ilength = strlen($sstring);
foreach($i = 0; $i < $ilength; $i++) {
……
}
B. 在函数循环体内实现接收参数能够是单值,也能够是数组。如(参考discuz):
function decho($input) {
if(is_array($input)) {
foreach($input as $v) {
decho($v);
}
} else {
echo $input;
}
}
C. 尽可能减小循环次数,如如下例子:
function neworder($aarray) {
sort($aarray);
$inum = count($aarray);
$iloop = round($inum / 2);
for($i = $inum; $i > $iloop; $i--){
$anewarray[] = $aarray[$i - 1];
$anewarray[] = $aarray[$inum - $i];
}
if($inum % 2 <> 0) {
$anewarray[] = $array[floor($inum / 2)];
}
print_r($anewarray);
$array = $anewarray;
}
$aarray = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11);
neworder($aarray);
4。使用建议:(1) 程序根目录定义
基本思路以程序中必然包含的公用文件为基准,好比include目录下的common.inc.php
define('ROOT', substr(dirname(__FILE__), 0, -7));
每一个入口脚本必须在开头包含此行语句,(-7为你公用包含文件所在目录名长度)
(2) require_once和include_once
基本不使用 include或require, 统一使用require_once和include_once
如非临时文件包含,则必须使用require_once,不然使用include_once如缓存文件,模板编译文件等。
为区别开,require_once 和 include_once 不加小括号。写法以下:
require_once ROOT . './include/xxxx.php';
路径书写前,必须加'./',必须使用/,而不使用\。
(3) 流程建议
A. 使用如下方式来控制开关。
if(in_array($smodel, array('cms', 'bbs', 'sns'))) {
……
}
B. 逻辑分支控制
纯数字或者固定值返回的控制用switch ... case
逻辑分支判断条件比较复杂时,使用 if ... else
逻辑分支结构都以函数为分割的,可采用以下方式:
function a() {
}
function b() {
}
//下面的值,能够是任意传参。这样效率分支开销效率比较高。
$scase = 'a';
$scase();
5. 文件目录命名
(1) 空目录索引
除主目录之外的全部目录放置一个1字节的index.htm来防止服务器目录列表打开时,服务器动态文件脚本被下载。
(2) 经常使用的目录
config文件夹,经常使用配置文件
template 模板文件夹
下面有default文件夹,表示程序默认模板
language 语言包文件夹
admin 后台管理目录
include/source 文件夹,主要函数包含文件
image 图片文件夹
js Javascript文件夹
API应用程序接口
install安装目录
data 生成文件的临时文件夹,下有几个目录:
cache文件缓存
log 日志文件
template 模板编译文件缓存
……
(3) 文件名,小写字母+下划线
扩展名:php文件用.php,模板文件使用.htm,JavaScript
文件使用.js
A.function_xxxx.php 表示函数包含文件
B.class_xxxx.php 表示类文件
C.不带下划线的字母文件名,表示功能主入口文件。
好比 index.php
D.某功能模块下,子功能文件名定义:
模块名_子功能.php,
如:member_register.php表示用户模块的注册功能文件。
language_friend.php表示朋友模块的语言包。
(4)PHP文件格式
编码:应用平台核心文件使用utf-8无BOM头,避免不一样编码形成的乱码(切忌使用记事本)。
标记:PHP文件必须使用 <?php,文件结尾不加?>,以防止空行带来的逻辑问题。
行分割:使用 \n 换行符,不可以使用 \r\n 或 \r。
6. 注释
有如下几种注释
A. 文档头部说明注释格式
/***
* 这是注释
* 是注释
* 注释
*/
B. 单行注释,必须如今所注释的前一行或简短写在行末
如
//这是注释,下面是变量赋值的例子
$inum = 55;
$inum = 55; //行末注释
C. 多行注释
/*
这是注释
*/
D. 尽可能不用 #、///等方式进行注释,
E. 代码书写完之后,冗余调试代码的注释必须删除掉,只剩简洁的代码功能描述注释
我但愿定一个开放性的规则,你们参与进来,并修订他
7. 代码提交
全部代码提交必须使用SVN或CVS等版本维护功能提交,不得使用FTP直接上传。
SVN同步,能够采用远程共享同一台机子的数据库。
或者同步data目录
也可遵循统一的命名,如统一的数据名、表名、域名、字段名、用户名、密码等。
而后基本数据库各本地拷贝一份。