php编码规范
以下规范来自与(php)微擎框架的的编码规范
编码规范的好处:
- 程序员可以了解任何代码,弄清程序的状况
- 新人可以很快的适应环境
- 防止新接触微擎的开发人员出于节省时间的需要,自创一套风格并养成终生的习惯
- 防止新接触PHP或微擎的开发人员一次次的犯同样的错误
- 在一致的环境下,开发人员们可以减少犯错的机会
- 程序员们有了一致的敌人
编码
请调整您的编辑器文件编码为 UTF-8,并关闭 UTF-8 BOM((Byte Order Mark))的功能。切记请不要使用windows自带的记事本编辑项目文件。
缩进
每个缩进的单位约定是一个Tab(禁止设置为空格替代,Tab宽度应表示为4个空白字符宽度),需每个参与项目的开发人员在编辑器(UltraEdit、EditPlus、ZendStudio等)中进行强制设定,以防在编写代码时遗忘而造成格式上的不规范
注释
注释是对于那些容易忘记作用的代码添加简短的介绍性内容。请使用 C 样式的注释“/* */”和标准 C++ 注释“//”。
书写规则
大括号{}、if和switch
- 首括号与关键词同行,尾括号与关键字同列;
- if 结构中,else 和 elseif 与前后两个大括号同行,左右各一个空格。另外,即便 if 后只有一行语句,仍然需要加入大括号,以保证结构清晰;
- switch 结构中,通常当一个 case 块处理后,将跳过之后的 case 块处理,因此大多数情况下需要添加 break。break 的位置视程序逻辑,与 case 同在一行,或新起一行均可,但同一 switch 体中,break 的位置格式应当保持一致。
以下是符合上述规范的例子:
if ($condition) {
//Statements
} else {
switch ($str) {
case 'abc':
$result = 'abc';
break;
default:
$result = 'unknown';
break;
}
}
运算符、小括号、空格、关键词和函数
- 每个运算符与两边参与运算的值或表达式中间要有一个空格;
- 左括号“(” 应和函数关键词紧贴在一起,除此以外应当使用空格将“(”同前面内容分开;
- 右括号“)”除后面是“)”,其他一律用空格隔开它们;
- 除字符串中特意需要,一般情况下,在程序以及HTML中不出现两个连续的空格;
- 任何情况下,PHP程序中不能出现空白的带有TAB或空格的行,即:这类空白行应当不包含任何TAB或空格。同时,任何程序行尾也不能出现多余的TAB或空格;
- 每段较大的程序体,上、下应当加入空白行,两个程序块之间只使用1个空行,禁止使用多行。
- 程序块划分尽量合理,过大或者过小的分割都会影响他人对代码的阅读和理解。一般可以以较大函数定义、逻辑结构、功能结构来进行划分。少于15行的程序块,可不加上下空白行;
- 说明或显示部分中,内容如含有中文、数字、英文单词混杂,应当在数字或者英文单词的前后加入空格。
根据上述原则,以下举例说明正确的书写格式:
$result = (($a + 1) * 3 / 2 + $num)) . 'Test';
$condition ? func1($var) : func2($var);
$condition ? $long_statement : $another_long_statement;
if ($flag) {
//Statements
//More than 15 lines
}
showmessage('请使用 restore.php 工具恢复数据。');
函数定义
- 参数的名字和变量的命名规范一致;
- 函数定义中的左小括号,与函数名紧挨,中间无需空格;
- 开始的左大括号与函数定义为同一行,中间加一个空格,不要另起一行;
- 具有默认值的参数应该位于参数列表的后面;
- 函数调用与定义的时候参数与参数之间加入一个空格;
- 必须仔细检查并切实杜绝函数起始缩进位置与结束缩进位置不同的现象;
例如,符合标准的定义:
function message($string, $operation, $key = '') {
if ($flag) {
//Statement
}
//函数体
}
不符合标准的定义:
function authcode($string,$operation,$key = '')
{
//函数体
}
引号
由于PHP中单引号和双引号具有不同的含义,因此在使用时有如下原则:
- 在能使用单引号的情况下,禁止使用双引号。
- 字符串为固定值,不包含换号、制表等特殊转义时,需使用单引号。
- 字符串作为数据索引时,需使用单引号。
- 字符串不需要带入变量,需使用单引号。
- 数据库SQL语句一律使用双引号,SQL语句中所有数据必须加单引号,无论数值还是字串,以避免可能的注入漏洞和SQL错误。
$sql = "UPDATE " . tablename('members') . " SET adminid='1' WHERE AND adminid='2'";
数据库操作
为保证数据操作安全,数据库操作有以下处理及书写原则:
- 所有数据库操作时必须使用PDO操作
- 所有SQL查询关键字大写,方便代码审查
- 所有SQL对象(表名,字段名,索引名等)必须用反引号包括
- 所有编码参数查询,必须使用PDO的参数绑定机制处理
- 不能绑定参数处理的查询(唯一的例外是 IN () 语句),必须处理好变量检测及字符串转义
这是一个完整的数据库操作示例:
$tids = array();
if (!empty($_GPC['select'])) {
foreach ($_GPC['select'] as $t) {
$tids[] = intval($t); //---- 必须将输入参数转换为无安全隐患的格式,数字列必须转换为数字列,字符串列必须使用 addslashes
}
}
if (!empty($tids)) {
$sql = 'SELECT * FROM ' . tablename('trades') . ' WHERE `username`=:username AND `tid` IN (' . implode($tids) . ')';
$pars = array();
$pars[':username'] = $_GPC['username'];
$trades = pdo_fetchall($sql, $pars);
}
变量、函数名
- 变量、函数名一律为小写格式;
- 以标准计算机英文为蓝本,杜绝一切拼音、或拼音英文混杂的命名方式;
- 变量命名只能使用项目中有据可查的英文缩写方式,例如可以使用 $data 而不可使用 $data1、$data2 这样容易产生混淆的形式,应当使用 $trade、$product 这样一目了然容易理解的形式;
- 可以合理的对过长的命名进行缩写,例如 $bio($biography),$tpp($threadsPerPage),前提是英文中有这样既有的缩写形式,或字母符合英文缩写规范;
- 必须清楚所使用英文单词的词性,在权限相关的范围内,大多使用 $allowXxx 或 $isXxx 的形式,前者后面接动词,后者后面接形容词。
- 变量名标识符不应当使用下划线“_”进行分割,函数名根据需要可按照模块单元名称使用下划线添加前缀,以实现命名空间的效果。但每个函数名标识符尽量避免出现三个以上的下划线。