如何减少bug(php 版本)

来源:互联网 发布:中国it从业人数 编辑:程序博客网 时间:2024/06/04 23:36

重点内容变量声明在使用

foreach 循环要注意赋值,特别是里面有if 判断时;
eg :

$arr = [    ['id'=>1, 'name' => 'hhee'],    ['id'=>0, 'name' => 'hhee0'],    ['id'=>3, 'name' => 'hhee0'],    ['id'=>4, 'name' => 'hhee0'],]$result = $temp = array();foreach($arr as $v){    $temp['title'] = 'xxx';    if($v['id']==0){        $temp['extra'] = 'extra';    }    $result[] = $temp;}

ok 这里就出问题了

$result = [    ['title' => 'xxx'],    ['title' => 'xxx', 'extra' => 'extra'],    ['title' => 'xxx', 'extra' => 'extra'],    ['title' => 'xxx', 'extra' => 'extra'],];

这就有可能跟我们预期的不一样了

变量类型,比如count(xx) , 如果xx 不是数组,返回的结果为1,有时候我们从缓存取数据,可能因为key 不存在,返回false , 如果这时候你把它当数组使用,就会出问题

缓存key 不存在,返回false ,如果你业务 存进去就是一个bool ,这时候就会出问题.

array_push(arr,xxx)arr 必须是数组

array_merge 参数必须都是数组,否则报错,如果在生产环境,一般屏蔽了报错,这时候得到的结果就是一个bool 的false

变量比较,php 是弱类型语言,比如

1 == '1'   true1 == '1a'  true '1a' 会被转换成整型(1),false == '0'   truefalse == '0q'  truestrpos() , 这个函数,可能返回0 ,表示在第0个位置匹配到了子字符串,所以不能直接if(!strpos('xxx','x')){}, 而是 if(strpos('xxx','x')!==false){}

切记 如果要做类型比较的时候,注意类换转换问题

if 做逻辑判断的时候

if(a == 1){    xxx}elseif(a == 3){    xxx}

这代码可能就会出现bug,最好是补全else这个分支

注意return , 一个方法最好只返回一种数据结构

if(a == 0){    return 'a';}elseif(a == 1){    return array(0,1)}elseif(a < 0 ){    return array('ok' => false , 'msg' => 'a 不能是小于0 的数' )}return false;

以上这种写法是错误的,调用这个函数的人,就要去判断多种情况,很容易产生bug,应该统一返回的数据结构。 比如 array('ok' => , 'msg' => 'msg' , 'data' => 'data') , 类似这种类型,具体情况具体分析。

try catch 问题

    try{        DB::beginTrans();        DB::exec("xxxx");        DB::exec("xxx");    }catch(Exception $e){        DB::rollback();    }    DB::commit();

这里要注意,try 里面如果出现异常,那么就会rollback ,事务已经不存在了,这时候在commit 就会出错

代码提交
我们在使用svn , 或者git 的时候,提交的时候一定要注意在检查一遍,因为你在本地开发,可能有些文件需要根据本地环境进行适当修改,如果不小心提交上去了,那么测试环境,肯定会出现错误,如果一不小心合到online版本,那么可能就是个灾难了,线上环境就会出错!(我就差点出现这个错误。还好在性能测试阶段发现了)

0 0