1、 UTF-8 without BOM -- 文件应该使用 Unicode(UTF-8)编码保存,且不包含字节序标记(BOM)[Why?];
2、 Spaces for indentation -- 缩进请使用 4 个空格,禁止使用 tab [Why?];
3、 LF Line Ending -- 换行要使用 Unix 换行符(为了在 Windows、Linux、OS X 三大平台中更好的兼容,现在 Linux、OS X 已统一为 Unix 换行符,这么做主要是为了 Windows);
以上 3 条为开发中的重要原则
4、 代码块标记请使用 <?php ?>
,禁止使用短标签,保持最好的兼容;PHP 文件只需带开始标记 <?php
,禁止带结束标记 ?>
;[Why?]
5、 注释要简洁明了、能描述清楚业务逻辑为佳,禁止无意义的注释:
有意义的注释:
1. $member = $db->getMemberInfo($id); //根据用户ID获取用户信息
2. if ($member['status'] == 1) //如果用户状态为禁用
无意义的注释:
1. $member = $db->getMemberInfo($id); //读取一条数据
2. if ($member['status'] == 1) //如果用户状态等于1
6、 [类名] 首字母大写,有多个单词时,禁止使用下划线,应该使用骆驼命名法,例如:
AdminController.php
OpenAdminController.php
7、 [方法名] 和 [变量名] 均使用骆驼命名法,例如:
getUserInfo()
updateUserInfoById()
8、 对于类中的方法名,在遵循上面原则的基础上,如果是private 则必须以下划线开头,例如:
private function _getUserPermission() {}
9、 提交代码前,请进行格式化操作,格式化推荐工具:phpfmt,也可以使用 phpfmt 的插件,支持如下编辑器 / IDE:
- Sublime Text 3
- Vim
- PHPStorm
格式化参数如下:
{
"autocomplete": true, //意义不明,如有知道请告知
"enable_auto_align": false, //当格式化对象为配置文件时,等号对齐要设为 true ***重要
"indent_with_space": true, //缩进转为空格
"psr1_naming": false, //不启用 psr1 规范的命名方式(方法名会变成骆驼命名法)
"psr2": true, //启用 psr2 规范
"version": 4 //意义不明,如有知道请告知
}
格式化的好处:
- 会把 namespace、use、class、method 用空行隔开,并且按照 alphabet 字典排序
- 会清理掉有 use 引入,却没有使用过的 use 对象
- 会帮你把 tab 转义为空格
- 会让代码更清晰易读
10、合理使用命名空间、自动加载等机制,合理引入 SDK 文件等;
11、变量必须初始化后再使用,从用户那里接收过来的参数必须强制转换类型;
12、数据库相关:
1. 只需要一条数据时,禁止查询全表;
2. 禁止用 select * 这种效率低下的方式,要明确写出需要的字段;
3. 能用 group by 解决的问题,禁止用 distinct;
4. 禁止把 join 时,该写在 on 条件里面的,写到 where 去;也同样禁止把该写在 where 条件里面的,写到 on 去;
5. 和金钱有关的字段,应使用 decimal;
6. 如果知道该字段不可能出现负值,请使用 unsigned;
7. 经常查询的字段,合理建立索引;
8. 禁止把任何字段设置为 [允许空],请设为 [不为空] 且默认空字符串 "";
9. 日期字段,如果是 1970 - 2037 年内的时间,请设置为 unsigned 且用 int (性能最佳),
如果是日志类型的,只是显示作用的,那么,请设为 datetime;
10.如果你只需要判断数据是否存在,而不需要取出数据,使用子查询更加高效 select exists(select 1 from table where xxx);
11.能用 between 的时候不要用 >=、<=、in、or,能用 in 的时候不要用 or
12、尽量使你的代码结构优雅、简洁、清晰、高效,例如:
12.1、高效率类型转换
$string = '1';
$string -= 0; //快速从 string 转为 int
$string .= ''; //快速从 int 转为 string
$string = '3.14159265358';
$string -= 0; //同理,快速从 string 转为 float
12.2、 合理使用引用来减少内存占用或赋值
$array = [
'a' => '1',
'b' => 2,
];
foreach ($array as &v) {
$v['a'] -= 0; //已经转换为 int
$v['c'] = 3; //添加新字段到数组中
}
var_dump($array); // ['a' => 1, 'b' => 2, 'c' => 3]
12.3、让你的代码结构更清晰
错误结构 1:
if ($a == 1) {
$b = 0;
} else {
$b = 1;
}
正确结构 1:
$b = 1;
if ($a == 1) {
$b = 0;
}
错误结构 2:
if ($result) {
return true;
} else {
return false;
}
if ($result) {
return true;
}
return false;
正确结构 2:
if (!$result) {
return false;
}
return true; //请保持方法结尾返回的是 true
错误结构 3:
if ($object) {
// todo...
} else {
// todo...
}
正确结构 3:
if (!$object) {
// todo...
return false;
}
//todo...
12.4、 在 PHP 中,数组的性能很高,因此要正确使用数组:
错误方式 1:
switch($index) {
case 1:
$b = 'ABC'; break;
case 2:
$b = 'DEF'; break;
default:
$b = 'GHI'; break;
}
错误方式 2:
if ($index == 1) {
$b = 'ABC';
} else if ($index == 2) {
$b = 'DEF';
} else {
$b = 'GHI';
}
正确方式:
$array = ['ABC', 'DEF'];
$b = isset($array[$index]) ? $array[$index - 1] : 'GHI';
12.5、 因为公司服务器的 PHP 版本较新,因此数组推荐使用新的方式,不要使用旧的方式
不推荐方式:
$arr = array(1, 2, 3);
推荐方式:
$arr = [1, 2, 3];
12.6、 如果只需要判断字符串中 [存在] 某个字符,请使用 strpos / stripos !== false
12.7、 如果取出的数据比较庞大,使用后应 unset
12.8、 需要 echo 数据时,使用 echo a, b, c 效率比 echo a; echo b; echo c; 和 echo a . b . c 性能更高
12.9、 定义或输出大量字符串或 HTML 时,可以使用 PHP 的 heredoc,参考
12.10、PHP 的时区系统会导致 strtotime 等不可预料的问题,推荐在 php.ini 文件里把 timezone 设置为 PRC或者Asia/Shanghai
13、在使用redis获取数据时,在使用如:hgetall, smembers, lrange, zrevrange ,zrange, 等命令时一定要加范围参数;注意:keys info*
这种模糊查找的绝对不能使用
14、对于在一个PHP CLASS文件中需要多处用到字符串,尽量在CLASS的顶部进行赋值定义,代码逻辑中直接使用类成员来处理,如:
class DemoAsync
{
/**
* 用户全站等级Redis KEY
*
* @var hash
*/
private static $userSiteLevelInfoKey = "user:slevel:%d";
/**
* 系统内部调用使用
*
* @param array $booter
* @return Treasure
*/
public static function instance($booter, $server){}
15、