博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PHP下隐藏BUG写法
阅读量:5941 次
发布时间:2019-06-19

本文共 1403 字,大约阅读时间需要 4 分钟。

hot3.png

隐藏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

你可能感兴趣的文章
GA操作步骤和技巧(二)——用户行为分析
查看>>
shell中while循环里使用ssh的注意事项
查看>>
SHELL获取计算机外网ip的几种写法
查看>>
博客正在搬迁中
查看>>
触发器与存储过程的区别
查看>>
我的友情链接
查看>>
centos搭建supervisor
查看>>
linux日志分割
查看>>
Samba再报安全漏洞
查看>>
我的友情链接
查看>>
我的友情链接
查看>>
Spring学习资料之 依赖注入(一)
查看>>
安装win7提示安装程序无法创建新的系统分区和定位现有系统分区
查看>>
快递查询接口的调用与解析案例
查看>>
我的友情链接
查看>>
服务器性能优化配置建议
查看>>
oracle sql语句实现累加、累减、累乘、累除
查看>>
SCNetworkReachabilityRef监测网络状态
查看>>
3D地图的定时高亮和点击事件(基于echarts)
查看>>
接口由40秒到200ms优化记录
查看>>