PHP下隐藏BUG写法

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

转载于:https://my.oschina.net/dogstar/blog/280328

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值