本想以 Effective PHP 为题的,然而 Effective C++ 是多么的优秀,以至于不敢
用这个神圣名字,萤火岂可与日月争辉。
PHP在大部分时候,性能都不是问题,小应用也没有优化必要,大应用一般也是从
架构和算法上做优化,从代码本身入手,收效甚微。然而,某些好习惯,如果能保
持,既无伤代码美观,也不会增加开发时间,累积起来的微小性能优势,也许会改
善那么点整体性能。
习惯 1:替换循环中的函数返回值,如果这个返回值在循环中不变。
解释:函数调用的开销不小,这类函数调用,目的在于使用它的返回值,而每次
返回值都一样的函数调用,实在没有必要,单独提取出来,用变量做替换,既减
少函数调用开销,更能增强代码逻辑。
习惯 2:函数的参数,如果是数组和字符串,尽可能用引用代替传值。
解释:数组和字符串的复制,开销是很大的,如果不会临时修改它,那么用引用,
减少大对象的复制,不仅节约时间,也节约空间。
习惯 3:用最规范的编码名字,而不是可兼容的别名。
解释:mb_string 系列函数,在执行的时候,如果指定了一个编码参数,PHP会
从标准编码名字表中查找编码名字,如果找不到,会尝试从标准编码的MIME字符
集名中查找,如果还是查找不到,会接着尝试标准编码名字的所有别名。这个过程
中,并没有很高效的算法,字符串的匹配,用的是 strcasecmp,性能本身就不高。
所以,应当避免不规范的编码名字。如果多次执行,应当先设置mb_string内部编
码名字,而不是每次都指定编码。(参考php源码中的mbfl_name2encoding函数)
习惯 4:用 PCRE , 而不是 POSIX Regex
解释:POSIX Regex 在 PHP 5.3.0 已被 DEPRECATED,在PHP6中,它就不存
在了。况且,PCRE远比POSIX Regex强大,而且PCRE是二进制安全的。
习惯 5:用===代替==,用!==代替!=
解释:参考php源码中的 is_identical_function 函数 和 is_equal_function函数,
不难看出,equal的性能,不如identical。而且,可以避免你不期望的转换,
引起让人感到惊讶的错误。
习惯 6:尽量使用普通字符串函数,而不是正则
解释:正则的开销通常远远高于一般字符串处理函数。
习惯 7:尽量使用php内置函数
解释:内置函数,正确性更有保障,大部分情况下性能也更好。特别是在操作数组的时
候,内置数组函数一般更为高效,因为php中,访问数组元素的开销比较大。
习惯 8:待续
解释:待续