隐藏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 在线文档,以获取最精确的帮助