PHP编码规范与原则
本条规范同样适用于 PHP、HTML、CSS、JavaScript。
前言
有太多的PHP程序猿都比较个性,对于编程也有自己的风格和习惯。暂且不说每个程序猿的习惯或风格是否合理,有自己的个性无可厚非,如果是单打独斗独立承担项目开发任务的话那也没什么,但是如果是团队合作开发的话,每个人都有自己的独立个性的编码习惯那就乱套了,别人无法清楚的读懂你的代码,同时你也无法很轻松的阅读别人的代码,互相抵触的情绪难免。本规范由编程原则组成,融合并提炼了开发人员长时间积累下来的成熟经验,意在帮助开发者养成良好一致的编程风格。
标准化的重要性和好处
当一个软件项目尝试着遵守公共一致的标准时,可以使参与项目的开发人员更容易了解项目中的代码、弄清程序的状况。使新的参与者可以很快的适应环境,防止部分参与者出于节省时间的需要,自创一套风格并养成终生的习惯,导致其他人在阅读时浪费过多的时间和精力。而且在一致的环境下,也可以减少编码出错的机会。标准不是项目成功的关键,但可以帮助我们在团队协作中有更高的效率并且更加顺利的完成既定的任务。
PHP编码规范与原则
文件编码及编辑器格式
编码
请调整您的编辑器文件编码为 UTF-8,并关闭 UTF-8 BOM的功能。切记请不要使用windows自带的记事本编辑项目文件。
注意:请确认你的编辑器不会有意或无意的保存文件为 UTF-8 BOM 格式, 否则可能造成系统通信不正常。
缩进
每个缩进的单位约定是一个Tab(禁止设置为空格替代,Tab宽度应表示为4个空白字符宽度),需每个参与项目的开发人员在编辑器(UltraEdit、EditPlus、Zend Studio等)中进行强制设定,以防在编写代码时遗忘而造成格式上的不规范。
换行
PHP项目中使用Unix风格的换行符,即只有换行( LF 或 “\n” )没有回车( CR 或 “\r” ),请在编辑器内调整。
代码标记
PHP程序需使用 <?php ?> 来界定 PHP 代码,在HTML页面中嵌入纯变量时,可以使用 <?php echo $variablename;?> 这样的形式。
注意:为了使代码规范化和标准化,开发中禁止使用 <? ?> 和 <?=$variablename?> 这种速记形式。
注释
注释是对于那些容易忘记作用的代码添加简短的介绍性内容。请使用 C 样式的注释“/* */”和标准 C++ 注释“//”。
例如:
1 2 3 4 5 |
<span class="co4">/** * 接口初始化文件 * [xxx System] Copyright (c) 2013 xxxf.com * 描述 */</span> |
开发留下的临时代码和调试代码必须添加注释,以免日后遗忘。所有临时性、调试性、试验性的代码,必须添加统一的注释标记“//debug”并后跟完整的注释信息,这样可以方便在程序发布和最终调试前批量检查程序中是否还存在有疑问的代码。
例如:
1 2 3 4 5 |
$num = 1; $flag = TRUE; //debug 这里不能确定是否需要对$flag进行赋值 if(empty($flag)) { //Statements } |
书写规则
大括号{}、if和switch
首括号与关键词同行,尾括号与关键字同列;
if 结构中,else 和 elseif 与前后两个大括号同行,左右各一个空格。另外,即便 if 后只有一行语句,仍然需要加入大括号,以保证结构清晰;
switch 结构中,通常当一个 case 块处理后,将跳过之后的 case 块处理,因此大多数情况下需要添加 break。break 的位置视程序逻辑,与 case 同在一行,或新起一行均可,但同一 switch 体中,break 的位置格式应当保持一致。
以下是符合上述规范的例子:
1 2 3 4 5 6 7 8 9 10 11 12 |
if($condition) { //Statements } else { switch($str) { case 'abc': $result = 'abc'; break; default: $result = 'unknown'; break; } } |
运算符、小括号、空格、关键词和函数
左括号“(” 应和函数关键词紧贴在一起,除此以外应当使用空格将“(”同前面内容分开;
右括号“)”除后面是“)”,其他一律用空格隔开它们;
除字符串中特意需要,一般情况下,在程序以及HTML中不出现两个连续的空格;
任何情况下,PHP程序中不能出现空白的带有TAB或空格的行,即:这类空白行应当不包含任何TAB或空格。同时,任何程序行尾也不能出现多余的TAB或空格;
每段较大的程序体,上、下应当加入空白行,两个程序块之间只使用1个空行,禁止使用多行。
程序块划分尽量合理,过大或者过小的分割都会影响他人对代码的阅读和理解。一般可以以较大函数定义、逻辑结构、功能结构来进行划分。少于15行的程序块,可不加上下空白行;
说明或显示部分中,内容如含有中文、数字、英文单词混杂,应当在数字或者英文单词的前后加入空格。
根据上述原则,以下举例说明正确的书写格式:
1 2 3 4 5 6 7 8 |
$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 工具恢复数据。'); |
函数定义
函数定义中的左小括号,与函数名紧挨,中间无需空格;
开始的左大括号与函数定义为同一行,中间加一个空格,不要另起一行;
具有默认值的参数应该位于参数列表的后面;
函数调用与定义的时候参数与参数之间加入一个空格;
必须仔细检查并切实杜绝函数起始缩进位置与结束缩进位置不同的现象;
例如,符合标准的定义:
1 2 3 4 5 6 |
function message($string, $operation, $key = '') { if($flag) { //Statement } //函数体 } |
不符合标准的定义:
1 2 3 4 |
function authcode($string,$operation,$key = '') { //函数体 } |
引号
由于PHP中单引号和双引号具有不同的含义,因此在使用时有如下原则:
1 |
$sql = "UPDATE " . tablename('members') . " SET adminid='1' WHERE AND adminid='2'"; |
数据库操作
为保证数据操作安全,数据库操作有以下处理及书写原则:
这是一个完整的数据库操作示例:
1 2 3 4 5 6 7 8 9 10 11 12 |
$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); } |
命名原则
命名是程序规划的核心。古人相信只要知道一个人真正的名字就会获得凌驾于那个人之上的不可思议的力量。只要你给事物想到正确的名字,就会给你以及后来的人带来比代码更强的力量。
名字就是事物在它所处的生态环境中一个长久而深远的结果。总的来说,只有了解系统的程序员才能为系统取出最合适的名字。如果所有的命名都与其自然相适合,则关系清晰,含义可以推导得出,一般人的推想也能在意料之中。
就一般约定而言,类、函数和变量的名字应该总是能够描述让代码阅读者能够容易的知道这些代码的作用。形式越简单、越有规则,就越容易让人感知和理解。应该避免使用模棱两可,晦涩不标准的命名。
变量、函数名
类和接口名
常量
变量的初始化与逻辑检查
任何变量在进行累加、直接显示或存储前必需进行初使化 ,例如:
1 2 3 |
$number = 0; // 数值型初始化 $string = ''; // 字符串初始化 $array = array(); // 数组初始化 |
安全性
包含调用
错误报告级别
1 2 3 4 5 6 7 8 |
//禁用错误报告 error_reporting(0); //报告运行时错误 error_reporting(E_ERROR | E_WARNING | E_PARSE); //报告所有错误 error_reporting(E_ALL); |
在软件开发和调试阶段,打开错误报告以便能够报告程序中所有的错误、警告和提示信息,以帮助开发者检查和核对代码,避免大多数安全性问题和逻辑错误、拼写错误。
其他注意要点
数据库设计
表和字段命名
代表id自增量的字段,通常用以下几种形式:
字段结构
SQL语句
运算与检索
文件及目录
文件命名
所有包含PHP代码的程序文件或半程序文件,应以小写.php作为扩展名,而不要使用.phtml、.php3、.inc、.class等作为扩展名。
普通程序
能够被URL直接调用的程序,例如home.php、index.php、forum.php,直接使用程序名+.php的方式命名
函数库和类库程序
分别以小写 xxxx.func.php 和 xxxx.class.php的格式命名书写。函数库和类库程序只能被其他程序引用,而不能独立运行。其中不能包含任何流程性的、不属于任何函数或类的程序代码。
空目录索引
PS:本文档会不定期更新。