zoco

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++) {}

11. 类中的function能改为static的话最好改成static(不建议在生产环境使用)

12. 对纯字符串用单引号来代替双引号

13. 变量使用完最好unset掉

13. 用include和require代替include_once和require_once