隐藏BUG一:empty的误用
对于empty的误用,主要体现在对一些特殊值的判断上,会与主观上大相庭径。如empty(' ')为false(对空格判空),又如empty(0)为true。而且,在使用上也需要注意不能类似这样使用empty(getResult()),否则可能会报错:PHP Fatal error: Can't use function return value in write context。
还有一些组合使用带来的隐藏BUG,如:!empty(stripos('dogstar', 'dog'))为true,是因为返回的位置为0,应该改成用:stripos('dogstar', 'dog') !== false。
隐藏BUG二:数值与字符的相等判断
考虑一下类似以下的场景:
$status = 'ok';if ($status == 0) { //分支1} else if($status == 'ok') { //分支2} else if ($status == 'fail') { //分支3} else { //分支4}
则上面的代码永远都不会进入第2分支,而是在第一分支就被拦截处理了,因为PHP比较运算符在判断前,如果涉及到数字内容的字符串,则字符串会被转换为数值并且比较按照数值来进行。也就是会将$status转成0(具体转换规则可查阅在线文档),最终导致$status == 0。
隐藏BUG三:循环数组的陷阱
//$data 由外部传入foreach ($data as &$val) { //TODO}if (!empty($val)) { //$val为$data数组的最后一个元素}
隐藏BUG四:全局变量与临时变量
很多时候,会有人使用全局变量来传递一些内部的参数,从而会带来一些难以发现的问题,如:
//$config settings ...doSth();doSth();//$config will be changed here!function doSth() { global $config; foreach ($someData as $config) { //... }}
以上的问题就是,一些临时的变量如果和全局变量同名时,会覆盖全局变量。应避免使用全局变量,如果确实需要,应统一全局变量名字,以便区分一般的临时变量,如加统一前缀或大写。
隐藏BUG五:请在同一个地方过滤赋值
考虑以下代码:
function doSth($id){ if(empty($id)) return false; $id = trim($id); callOtherFun($id);}function callOtherFun($id){ if(empty($id)) throw new Exception('wrong id!');}
当参数$id为空格时,即使用doSth(' ')会抛出异常,是因为在后来的过滤赋值时进行了过滤,导致前后判断的值不一样。
开发建议:
1、在开发过程中,请查询http://www.php.net 在线文档,以获取最精确的帮助