说在前面
代码优化是一个持续不断的过程,养成一个好的编码习惯,善用一些PHP的语法糖,让我们的代码看起来更好维护更不容易出错,这本身就是一种优化。还有一种就是对代码的可读性再做一次优化,让代码更好维护。
if的使用技巧
if的使用技巧之 “给定初始值”
来看一段代码1
2
3
4
5
6if(1 == $orderState){
$orderTitle = "已预定";
}else{
$orderTitle = "已售出";
}
return $orderTitle;
给定初始值之后,我们可以写成这样,少了一层else1
2
3
4
5$orderTitle = '已售出';
if(1 == $orderState){
$orderTitle = '已预定';
}
return $orderTitle;
if的使用技巧之 “用 && 替换 if”
1 | if(!isset($newpwd[6])){ |
可以替换成,知道能这样用就行1
!isset($newpwd[6]) && $message = '密码长度不足';
if的使用技巧之“三元运算符替换if”
1 | if(empty($_post['action'])){ |
也可以替换成1
$action = (empty($_post['action']))? 'default' : $_post['action'];
也可以把三元运算符简写成1
$action = $_post['action']?:'default';
if的使用技巧之 “去掉多此一举的if”
这个函数是判断一个年份是否是闰年,如果是返回ture否则返回false1
2
3
4
5
6
7function isLeapYear($year){
if(($year % 4 == 0 && $year % 100 != 0) || ($year % 400 == 0)){
return true;
}else{
return false;
}
}
类似于这种判断一个条件是否为真,为真返回ture为假返回false的时候,我们可以直接返回这个条件就可以了1
2
3function isLeapYear($year){
return ($year % 4 == 0 && $year % 100 != 0) || ($year % 400 == 0);
}
改进“else if”
1 | if('你'==$sortname){ |
可以用switch来改造多层的判断1
2
3
4
5
6
7
8
9
10
11
12
13
14switch($sortname){
case'你':
$sortid = 1;
break;
case'还':
$sortid = 2;
break;
case'好':
$sortid = 3;
break;
case'吗':
$sortid = 4;
break;
}
表驱动法替代“else if”
上面那个例子用switch似乎让代码变多了,但看起来更简洁了,如果你还不爽,那下面。。。
在PHP里面数组可以理解为一个hash表1
2
3
4
5
6
7$sortTable = [
'你'=>1,
'还'=>2,
'好'=>3,
'吗'=>4
];
$sortid = $sorTable[$sortname];
循环语句的几个要点
要写无限循环时,用while(true)表示无限循环,别用for。
特定情况下(发邮件、采集网页)要加延时(sleep)
循环体内尽可能不用函数或更消耗资源的调用
foreach代替while和for循环(PHP)
避免空循环
只做一件事,尽可能短,控制在50行以内
循环嵌套限制在3曾以内
使用更精悍短小的代码
函数的最佳最大长度时50-150行代码
函数参不超过7个
短小函数更容易理解也方便修改
只做一件事情的函数更易于复用
短小的函数测试更方便
中间结果赋值给变量
1 | $str = 'this_is_a_test'; |
你觉得这样写好不好呢?我以为这样很cool,一行就搞定,实际上这样写并不好,乍一看不好理解,另外还不好调试。那怎么改造这种代码呢?把中间结果赋值给变量1
2
3
4$str = 'this_is_a_test';
$words = explode('_',$str);
$uWords = array_map('ucfirst',$words);
$humpstr = implode('',$uWords);
复杂的逻辑表达式做成布尔函数
1 | if(!$hasone && 1==$ddisfirst && ''==$litpic &&empty($litpicname)){ |
你像这样四个条件并在一起满足的条件下才会执行下面的代码,是不是会很难理解,所以复杂的逻辑表达式做成布尔函数,就是把它给切开1
2
3
4
5$emptyPic = ( ''==$litpic &&empty($litpicname);
$validFirstPic = (!$hasone && 1==$ddisfirst && '');
if($emptyPic && $validFirstPic){
$litpicname = GetImageMapDD($iurl,$cfg_ddimg_width);
}
永远不要复制粘贴雷同的代码
相同的代码放在一起让以后修改更轻松
可以让全局的统计和过滤器等实现方便
可复用的带参函数是解决雷同代码的好方法