PHP代码洁癖心得

if的使用洁癖
给定初始值
1
2
3
4
5
6
7
8
9
10
11
12if ($orderStatus == 1) {
$orderDesc = '已支付';
# 其他的elseif ...
} else {
$orderDesc = '未支付';
}
// 优化后
$orderDesc = '未支付';
if ($orderStatus == 1) {
$orderDesc = '已支付';
}简单的判断使用
&&代替1
2
3
4
5
6if (strlen($newPwd) < 6) {
$message = '密码长度不足!';
}
// 优化后
strlen($newPwd) < 6 && $message = '密码长度不足!';三元运算符
1
2
3
4
5
6
7
8if (empty($_POST['action'])) {
$action = 'default';
} else {
$action = $_POST['action'];
}
// 优化后
$action = empty($_POST['action']) ? 'default' : $_POST['action'];简化三元运算符
?:或??1
2
3
4
5
6$action = empty($_POST['action']) ? 'default' : $_POST['action'];
// 简写后
$action = $_POST['action'] ?: 'default'; # 可保证$_POST下存在action
# 或
$action = $_POST['action'] ?? 'default';去掉多此一举的
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22/**
*
* @desc 是否为闰年
*
* @params int $year 年份
*
* @return bool
*/
function isLeapYear(int $year):bool
{
if (($year % 4 == 0 && 100 !=0) || ($year % 400 == 0)) {
return true;
} else {
return false;
}
}
//优化后
function isLeapYear(int $year):bool
{
return ($year % 4 == 0 && 100 !=0) || ($year % 400 == 0);
}对同一对象,含有多层逻辑,使用
switch代替elseif1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25if ('玄幻' == $sortname) {
$sort = 1;
} else if ('武侠' == $sortname) {
$sort = 2;
} else if ('言情' == $sortname) {
$sort = 3;
} else if ('其他' == $sortname) {
$sort = 10;
}
//优化后
switch ($sortname) {
case '玄幻':
$sort = 1;
break;
case '武侠':
$sort = 2;
break;
case '言情':
$sort = 3;
break;
case '其他':
$sort = 10;
break;
}表驱动法
1
2
3
4
5
6
7
8
9// 对上述逻辑修改,也可以声明数组选项,如遇复杂逻辑处理,也可以使用匿名函数
$sortTable = [
'玄幻' => 1,
'武侠' => 2,
'言情' => 3,
'其他' => function ($name) {},
];
$sortId = $sortTable[$sortname]($name) ?? 10;
循环语句
while(true)标识无限死循环,别用for;- 特定情况下,如发邮件、采集内容时,要加延时
sleep; - 循环体内,尽可能的避免调用复杂逻辑的函数或更多资源的调用;
foreach代替while和for循环;- 避免空循环;
- 只做一件事,尽可能短,控制在
line ≤ 50; - 循环嵌套限制在3层以内;
- 循环条件内不做运算;
函数体
- 函数的最佳最大长度是
50 ≤ line ≤ 150; - 函数形参最多不超过 7 个;
- 短小函数更容易理解,也方便修改/维护;
- 只做一件事的函数,更易于复用;
- 短小函数测试更方便;
其他
避免使用幻数
magic numbers;1
2
3
4
5<meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />
//优化后
define('APP_CHARSET', 'UTF-8');
<meta http-equiv="Content-Type" content="text/html;charset={APP_CHARSET}" />将一些比较难理解的东西,定义的常量(类中),这样代码可读性高
中间结果赋值给变量;
1
2
3
4
5
6
7
8$str = 'this_is_a_test';
$humpstr = implode('', array_map('ucfirst', explode('_', $str)));
// 优化后
$str = 'this_is_a_test';
$words = explode('_', $str);
$uWords = array_map('ucfirst', $words);
$humpstr = implode('', $uWords);复杂的逻辑表达式做成布尔函数;
1
2
3
4
5
6
7
8
9
10if (!$hasone && $ddisfirst = 1 && $litpic == '' && empty($litpicname)) {
$litpcname = GetImageMapDD($iurl, $cfg_ddimg_width);;
}
// 优化后
$emptyPic = ($litpic == '' && empty($litpicname));
$validFirstPic = (!$hasone && $ddisfirst);
if ($validFirstPic && $emptyPic) {
$litpcname = GetImageMapDD($iurl, $cfg_ddimg_width);;
}永远不要CV雷同的代码;
相同的代码放一起让以后修改更轻松
可以让全局的统计和过滤器等实现方便
可复用的带参函数是解决雷同代码的好办法
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Michael's Blog!
评论



