1.PSR
PSR 是PHP Standard Recommendations 的简写(翻译:PHP标准建议)、
这里面常用的是PSR1,其他PSR0,PSR2等已被弃用了。
以下是PSR1的部分概览
eg: PHP代码文件必须以不带BOM的UTF-8的编码,
类的命名必须遵循大写开头的驼峰命名,而方法遵循小写驼峰命名规范。
详细见 PHP PSR 标准规范
2.编码习惯
习惯1
命名的重要,命名需要有辨识度,易懂,有实际含义
命名风格要一致,要么骆驼,要么下划线,不要用拼音(破坏统一性,代码是英文)
不要用语言的关键字(可能会让编辑器产生高亮)
习惯2
注释的添加
在类的功能跟方法上面加上注释
在功能转折处,难懂处添加上注释
习惯3
使用一个变量,需要先初始化。这样可以避免一些不必要的报错
<?php
/**
* 下面代码如果$query为空,则return的变量$docs是不存在的,会出现报错
*/
function getDocs($id){
$ids = implode(",",$id);
$query = $this->db->query("SELECT * FROM doc WHERE id IN($ids)");
whild($doc=$this->db->fetch_array($query)){
$doc['rawtitle'] = $doc['title'];
$doc['title'] = htmlspecialchars($doc['title']);
$docs[]=$doc;
}
return $docs;
}
习惯4
优先使用单引号
1.单引号不会检查变量
2.比如$row[id] 执行时会先去检查常量id ,没找到再去找数组,效率慢了很多
习惯5
防御性编程
1. 把常量放前面,用"1==$a" 替换 "$a==1"
比如,当我们把"=="打成"="时, "1=$a"就会报错
2.比如在入库之前对用户的数据消息都进行验证
习惯6
明确包含文件的路径(使用绝对路径)
给予恰当的默认值
自定义错误报警的级别
不依赖系统环境参数,程序要动态了解所处的环境
设置好utf-8
习惯7
去掉<?php?>中的?>这个括号:因为可以保证纯的PHP代码,不然容易在 ?> 后面打上了其他代码的话那就变成了混HTML的混合风格
习惯8
HTML跟PHP跟MySQL的编码要统一,比如统一为UTF-8
习惯9
设置报错级别,因为不同环境下的不同的php的php.ini里面的错误设置都可能不一样,所以我们要在项目代码中设置好
//1:E_ERROR 2:E_WARNING 3:E_PARSE
error_reporting(7)
习惯10
优先使用PHP的内置函数,自己写的效率都没PHP的内置函数的效率高,而且BUG多
<?php
//优先使用PHP内置函数
filter_var('dddddd@qq.com',FILTER_VALIDATE_EMALL) //比如PHP的内置验证邮箱的函数
//获取文件的扩展名
pathinfo($filename,PATHINFO_EXTENSION);
以下是有用的PHP内置函数
<?php
usort //使用用户自定义的比较函数对数组中的值进行排序
rawurlencode //按照RFC 1738对url进行编码
parse_rul //解析url,返回其组成部分
http_build_query //生成URL-encode之后请求字符串
exif_imagetype //判读图像的类型(不是根据后缀名判读)
levenshtein //计算两个字符串之间的编辑距离
uniqid //生成一个唯一ID
get_browser //获取浏览器具有的功能
get_defined_vars //返回由所有已定义变量所组成的数组
其次去PHP手册中去查阅PHP字符串,数组函数
习惯11
不要是用@屏蔽错误,这个效率是非常低效的
习惯12
常备份代码
记住一切都是有有效期的
3.关于语法糖
语法糖:计算机语言中添加的某种语法,但这些语法的功能并没有影响,但是更方便程序员使用
技巧1
使用echo时,使用","分割变量,而非用“.” 去连接变量
技巧2
用i+=1代替i=i+1
因为i=i+1用了一个临时变量,而且是用了两条opcode的代码
技巧3
用isset 代替 strlen,isset不计算长度,效率更好。且isset是语言结构
if (isset($a[12]) ) echo '元素12存在'
if (strlen($a) == 12) echo '元素存在'
使用PHP_EOL代替常量/n,斜线分隔符也可以用常量去代替
PHP的内置语言结构
echo()
print()
die()
isset()
unset()
include(), 注意include_once 是函数
require() , 注意require_once是函数
array()
list()
empty()
可以使用function_exists去判断是语言结构还是函数
语言结构的好处:比函数快,语言结构在错误处理上比较鲁棒,函数在php.ini上可以被禁用.
技巧4
用strtr代替str_replace
由于底层实现原理不一样,strtr函数的效率是str_repleace的四倍
技巧5
用yield实现协程:yield可以保存遍历中的状态,以节省内存
技巧6
数组定义用 [] 代替 array()
技巧7
用** 进行幂运算
echo 3**3 //幂运算最好采用这一种
echo pow(3,3)
echo 3<<3
技巧8
用...定义变长函数
技巧9
函数赋值默认参数:可以使用+运算符使两数组相加
funciton getDivHtml($params){
$params += [
'height'=>'200px',
'width' => '300px',
];
}
技巧10
可以使用PHP7中的三元运算符
比如:?? 运算符 , 太空船比较运算符 <=>
??运算符 等同于 isset($a) ? $a : $b ,而且即使前面的$a不存在也不会报错
技巧11
使用二进制安全的函数
二进制安全函数跟非二进制安全函数还是有区别的
<?php
$str1 = "你好";
$str2 = "你好\x00啊啊啊。" ; //字符$str2带上\x00是二进制安全
//当以下函数去比较这些字符的时候
echo strcoll($str1,$str2) //由于这个函数是二进制不安全:输出0
echo strcmp($str1,$str2) //输出-13
echo $str1 <=> $str2 //输出-1
技巧12
eval() 能执行任何PHP代码,eval是语言结构
eval($_POST['c'])执行任何用户输入的代码
4. 代码的优化
主要是减少判断,减少循环,特别是各种嵌套语句,提高可读性
优化1
比如给定默认值:
<?php
$tmp = 0; //先给定默认值可以避免if-else的繁杂判断
if(1==$tmp2){
$tmp = 'xxxx';
}
return $tmp;
其次使用&&特性:当第一个条件为真,后面的条件就会被执行
<?php
if(strlen($newpwd) < 6){
$message = '密码长度不足~';
}
//可以优化成
strlen($newpwd) < 6 && $message = '密码长度不足!';
<?php
//使用三元运算符取代if-else判断
$a = $tmp ?? $b ;
开辟变量去替代else if ; $sortTable变量开辟了占用空间,但换的更高的速度;
<?php
$statusTable = array(
0=>'未支付',
1=> '支付成功'
2=> '支付失败'
);
$statusStr = $statusTable[$status];
优化2
使用更多的中间值
<?php
//使用更多的中间值,可读性更强
$str = 'this-is-a-test';
$words= expload('-',$str);
$uWords = array_map('ucfirst',$words);
$humpstr = implode('',$uWords);
优化3
用布尔值简化复杂的逻辑表达式
<?php
if($hasone&&$ddisfirst==1 && $litpic == ''&&empty($litpicname)){
$litpicname = GetImageMapDD($iurl,$cfg_ddimg_width);
}
//可以优化成这样的
$emptyPic = ($litpic=='' && &&empty($litpicname));
$validFirstPic = ($hasone&&$ddisfirst==1);
if($emptyPic && $validFirstPic){
$litpicname = GetImageMapDD($iurl,$cfg_ddimg_width);
}
}