重点内容变量声明在使用
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' true
1 == '1a' true '1a' 会被转换成整型(1),
false == '0' true
false == '0q' true
strpos() , 这个函数,可能返回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版本,那么可能就是个灾难了,线上环境就会出错!(我就差点出现这个错误。还好在性能测试阶段发现了)