php编码习惯总结
- 1. php变量、函数、类、文件名命名要有意义
- 2.适当的使用注释
- 3.多备份重要的代码
- 4.坚持字符编码统一
- 5.使用之前,变量要初始化
- 6.使用 NULL === 来代替 is_null
- 7.尽量使用 === 尽量不用 ==
- 8.避免在 for循环中计算
- 9.strtr替代
- 10.优先使用单引号
- 11.header头的编码
- 12.php结束标记不要写
- 13.测试环境开启所有错误
- 14.屏蔽错误非常低效
- 15.用 FALSE表示错误 , 用 NULL表示不存在
- 16.优先使用 PHP内置函数
- 17.防御式编程思想
- 18.常见的 PHP的语法糖
- 19.echo的逗号和点号
- 20.判断字符串的长度
- 21.使用 []代替
- 22.用 ... 定义变长参数函数
- 23.不用eval()
- 24.PHP代码的优化
PHP的编码规范
https://github.com/PizzaLiu/PHP-FIG
1. php变量、函数、类、文件名命名要有意义
- 不用语言关键字
- 命名要有实际含义
- 命名风格保持一致
- 不用拼音命名
2.适当的使用注释
终极要求:代码就是注释
- 好的代码应该是自描述的
- 难以理解的地方加上注释
- 函数的功能加上注释说明
- 类的功能和使用方法加注释
3.多备份重要的代码
- 代码不能只有一份
- 启用编辑器的自动备份
- 用代码管理工具备份
4.坚持字符编码统一
PHP文件编码 == 模版编码 == 数据库编码
5.使用之前,变量要初始化
使用一个未定义的变量, 比使用一个定义好的变量要慢8倍以上!
可以相像 , PHP引擎会首先按照正常的逻辑来获取这个变量 , 然而这个变量不存在 , 所以 PHP引擎需要抛出一个 NOTICE, 并且进入一段使用未定义变量时应该走的逻辑 , 然后返回 一个新的变量.
另外 , 阅读代码的角度讲 , 当你使用一个未定义的变量时 , 会让阅读你代码的人困惑 :”这 个变量在那里初始化的 , 和之前的代码有关系么 ? 和 include进来的文件有关系么
function getInfo($arrId){
$ids = implode(',', $arrId);
$query = mysql_query("select * from test where id in ($ids)");
while($info = mysql_fetch_array($query)){
$info['name'] = trim($info['name']);
$info['addr'] = trim($info['addr']);
$list[] = $info;
}
return $list;
}
function getInfo($arrId){
$list = array();
$ids = implode(',', $arrId);
$query = mysql_query("select * from test where id in ($ids)");
while($info = mysql_fetch_array($query)){
$info['name'] = trim($info['name']);
$info['addr'] = trim($info['addr']);
$list[] = $info;
}
return $list;
}
6.使用 NULL === 来代替 is_null
is_null和 NULL === 完全是一样的效果, 但是却节省了一次函数调用.
7.尽量使用 === 尽量不用 ==
PHP有俩组相等比较运算符 === / !== 和 == / != , == / != 会有隐式类型转换, 而 === / !==
会严格比较俩个操作时是否类型相同并且值相等.
8.避免在 for循环中计算
for($i=0; $i<strlen($str); $i++) {
}
会导致每次循环都调用strlen, 改为
$j=strlen($str);
for ($i=0; $i<$j; $i++) {
}
9.strtr替代
$subject = 'hello, world';
echo strtr($subject, array('hello'=>'world', 'world'=>'hello'));
echo str_replace(['hello'=>'world'], ['world'=>'hello'],$subject);
strtr 是str_replace的4倍
10.优先使用单引号
$row[‘id’] 的效率是 $row[id] 的7倍
11.header头的编码
header("Content-type: text/html;charset=utf-8");
12.php结束标记不要写
纯 PHP 代码,最好在文件末尾删除 PHP 结束标记
13.测试环境开启所有错误
error_reporting(7)
1:E_ERROR
2:E_WARNING
4:E_PARSE
但切记,上线之后要关闭我们的报错,将我们的错误代码写入到错误日志中,方便查错
14.屏蔽错误非常低效
养成不用 @ 的好习惯
$handle = @file('a.txt');
15.用 FALSE表示错误 , 用 NULL表示不存在
对于操作类的函数, 失败返回FALSE, 表示”操作失败了”, 而对于查询类的函数,
如果找不到想要的值, 则应该返回NULL, 表示”找不到”.
16.优先使用 PHP内置函数
正则耗时, 尽量避免, 而采用直接的字符串处理函数代替, 如:
filter_var('zhangsan@163.com', FILTER_VALIDATE_EMAIL);
有用的 PHP内置函数
usort — 使用用户自定义的比较函数对数组中的值进行排序
rawurlencode — 按照 RFC 1738 对 URL 进行编码
parse_url — 解析 URL,返回其组成部分
http_build_query — 生成 URL-encode 之后的请求字符串
exif_imagetype — 判断一个图像的类型
uniqid — 生成一个唯一ID
get_browser — 获取浏览器具有的功能
str_word_count — 返回字符串中单词的使用情况
我们 php手册中常见的字符串函数和数组函数,也需要熟悉,优先使用
17.防御式编程思想
不要相信外部的一切输入! 所有的输入都要检查!
$username = htmlspecialchars($_GET['username']);
18.常见的 PHP的语法糖
echo(), print(),die(),isset(),unset(),include(),include_once(),requ
ire(),require_once(),array(),list(),empty(),eval()
19.echo的逗号和点号
逗号优于点号
$foo = 'hello';
$bar = 'world';
echo $foo . $bar;
echo $foo , $bar;
20.判断字符串的长度
strlen()函数函数执行起来相当快,只返回在zval 结构中存储的已知字符串长度。
但是由于strlen()是函数,多多少少会有些慢
$str = 'hello';
if (strlen($str) === 5) echo 'do sth...';
if (!isset($str[5])) echo 'do sth..';
21.使用 []代替
$arr = array();
$arr = [];
$arr = array(1,2,3,4);
$arr = [1,2,3,4];
22.用 … 定义变长参数函数
function addAll(...$num){
$sum = array_sum($num);
return $sum;
}
addAll(1,2,3,4,5,6,7);
23.不用eval()
eval() 能够执行所有的php代码,非常的危险!慎用!
eval('echo `pwd`;');
24.PHP代码的优化
if代码块的优化
<?php
if ( 1 == $orderState ) {
$status = 'success';
}else{
$status = 'error';
}
return $status;
#### 完全可以简化成如下代码
$orderState = 'error';
if ( 1 == $orderState ) {
$status = 'success';
}
return $status;
使用三元运算符来替换
<?php
if ( !empty($_POST['action']) ) {
$action = $_POST['action'];
}else{
$action = 'default';
}
#### 完全可以简化成如下代码
$action = !empty($_POST['action']) ? $_POST['action'] : 'default';
中间结果赋值给变量
<?php
$str = 'this_is_test';
$res = implode('', array_map('ucfirst', explode('_', $str)));
#### 完全可以简化成如下代码
$str = 'this_is_test';
$words = explode('_', $str);
$uWords = array_map('ucfirst', $words);
$res = implode(' ', $uWords);
使用更加精悍短小的代码
- 函数的最佳最大长度是 50-150行代码 ,更容易理解也方便修改
- 函数参数 不超过7个
- 只做一件事情的函数更易于复用
PHP的一些重点特性
php从5.3开始,5.4,5.5,5.6一直到7都在不停的更新,这个过程中,加入了一
些其他语言比较好的语法,剔除了一些烂的语法。如下:
- default_charset从ISO-8859-1已经变为UTF-8
- 新增了动态访问静态方法的方式
- 内置用于开发的 CLI 模式的 web server
- 实例化时访问类成员 (new Foo)->bar();
- 新增 array_column() 函数
- 直接通过下标获取访问数组和字符串字面量的元素或字符
- empty() 支持传入一个任意表达式,而不仅是一个变量
- 新增 finally 关键字
- 新增 trait 语法
- 新增 yield 语法