说在前面

代码优化是一个持续不断的过程,养成一个好的编码习惯,善用一些PHP的语法糖,让我们的代码看起来更好维护更不容易出错,这本身就是一种优化。还有一种就是对代码的可读性再做一次优化,让代码更好维护。

if的使用技巧

if的使用技巧之 “给定初始值”

来看一段代码

1
2
3
4
5
6
if(1 == $orderState){
$orderTitle = "已预定";
}else{
$orderTitle = "已售出";
}
return $orderTitle;

给定初始值之后,我们可以写成这样,少了一层else

1
2
3
4
5
$orderTitle = '已售出';
if(1 == $orderState){
$orderTitle = '已预定';
}
return $orderTitle;

if的使用技巧之 “用 && 替换 if”

1
2
3
 if(!isset($newpwd[6])){
$message = '密码长度不足';
}

可以替换成

1
!isset($newpwd[6]) && $message = '密码长度不足';

if的使用技巧之“三元运算符替换if”

1
2
3
4
5
if(empty($_post['action'])){
$action = 'default';
}else{
$action = $_POST['action'];
}

也可以替换成

1
$action = (empty($_post['action']))? 'default' : $_post['action'];

也可以把三元运算符简写成

1
$action = $_post['action']?:'default';

if的使用技巧之 “去掉多此一举的if”

这个函数是判断一个年份是否是闰年,如果是返回ture否则返回false

1
2
3
4
5
6
7
function isLeapYear($year){
if(($year % 4 == 0 && $year % 100 != 0) || ($year % 400 == 0)){
return true;
}else{
return false;
}
}

类似于这种判断一个条件是否为真,为真返回ture为假返回false的时候,我们可以直接返回这个条件就可以了

1
2
3
function isLeapYear($year){
return ($year % 4 == 0 && $year % 100 != 0) || ($year % 400 == 0);
}

改进“else if”

1
2
3
4
5
6
7
8
9
if('你'==$sortname){
$sortid = 1;
}else if('还'==$sortname){
$sortid = 2;
}else if('好'==$sortname){
$sortid = 3;
}else if('吗'==$sortname){
$sortid = 4;
}

可以用switch来改造多层的判断

1
2
3
4
5
6
7
8
9
10
11
12
13
14
switch($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个
短小函数更容易理解也方便修改
只做一件事情的函数更易于复用
短小的函数测试更方便

中间结果赋值给变量

$str = ‘this_is_a_test’;
$humpstr = implode(‘’,array_map(‘ucfirst’,explode(‘_’,$str)));
你觉得这样写好不好呢?我以为这样很cool,一行就搞定,实际上这样写并不好,乍一看不好理解,另外还不好调试。那怎么改造这种代码呢?把中间结果赋值给变量

1
2
3
4
$str = 'this_is_a_test';
$words = explode('_',$str);
$uWords = array_map('ucfirst',$words);
$humpstr = implode('',$uWords);

复杂的逻辑表达式做成布尔函数

1
2
3
if(!$hasone && 1==$ddisfirst && ''==$litpic &&empty($litpicname)){
$litpicname = GetImageMapDD($iurl,$cfg_ddimg_width);
}

你像这样四个条件并在一起满足的条件下才会执行下面的代码,是不是会很难理解,所以复杂的逻辑表达式做成布尔函数,就是把它给切开

1
2
3
4
5
$emptyPic = ( ''==$litpic &&empty($litpicname);
$validFirstPic = (!$hasone && 1==$ddisfirst && '');
if($emptyPic && $validFirstPic){
$litpicname = GetImageMapDD($iurl,$cfg_ddimg_width);
}

永远不要复制粘贴雷同的代码

相同的代码放在一起让以后修改更轻松
可以让全局的统计和过滤器等实现方便
可复用的带参函数是解决雷同代码的好方法


 评论


本站使用 Material X 作为主题 , 总访问量为 次 。
隐藏