php语法优化实践
2015-02-19
1. 避免使用array_walk_recursive或其他形式的递归
比如想要对一个多位数组的内容进行过滤 使用array_walk_recursive的写法为
function outputFilter(&$value) {
$value = preg_replace('', '', $value);
}
}
array_walk_recursive($output, 'outputFilter');
其实我们可以把多维数组降成一维,使用array_reduce或者json_encode将数组变为字符串进行处理。
function outputFilter_u(&$value) {
$value = preg_replace('', '', $value);
}
$json = json_encode($output);
outputFilter_u($json);
2. 用isset代替in_array
尤其是越大的数组这种对比越明显
避免
if (in_array('1', $array)) {}
使用
if (isset($array['1'])) {}
3. 少用@错误抑制符
虽然会减少了warning和notice,但是实际上会带来性能的下降
避免
@test();
4.避免Deep Array
对于C来说, 符号在执行器都会变成地址(绝大部分), 而对于PHP来说, 符号都需要经过查找(Hash Lookup)才能使用, 于是我也看到了类似下面的代码
for ($i=0; i<10;i++) {
$arr[1][2][3][4][5] = $i;
}
这样的话,每一次循环, 都会带来6次的Hash Lookup…..
5. 变量先定义再引用
这样不仅会在性能上得到一定的提升,而且最重要的是代码的可读性会提升,毕竟看代码看的看的突然出现一个不知道什么意思的变量,你懂的……
6. 用isset($string[5])代替strlen($string)(不建议在生产环境使用)
避免
if (strlen($strings) > 10) {}
改为
if (isset($strings[10])) {}
7. 用 === 代替 ==
除了隐式转换规则外, 还有一点就是如果使用===, 对于日后的维护或者阅读你代码的人也会很舒服:”在这个时刻, 这一行语句, 这个变量就是这个类型的!”。
8. 用 null === $a 代替 is_null($a)
9. 用str开头的函数代替preg开头的函数
例如strtok、strstr、strpos、str_replace、substr、explode、implode等等。
10. 避免循环定义中的操作
避免
for ($i = 0; $i < sizeof($array); $i++) {}
改为
$count = sizeof($array);
for ($i = 0; $i < $count; $i++) {}