一、项目背景
初衷
最近因为同事离职(bèi cái)接手了别人的开发项目,每个人的代码风格是不一样的,对于php三元运算符,我习惯使用“?:”,发现他使用的三元运算符“??”在项目运行过程中存在隐形bug,所以着重记录一下,希望能帮助大家避坑。
代码实例
代码修复前
// 参数赋值
// ?? <= 作用相当于 isset($a) ? $a : $b;判断一个变量a否存在,存在则赋值变量a,不存在赋值变量b
$data['query_type'] = $request['query_type'] ?? 0;
$data['type'] = $request['type'] ?? 1;
$data['mer_id'] = $request['mer_id'] ?? 0;
那么问题来了,在这种情况下, r e q u e s t [ ′ q u e r y t y p e ′ ] 参数在前端接口传空值时,即 request['query_type']参数在前端接口传空值时,即 request[′querytype′]参数在前端接口传空值时,即request[‘query_type’]=''时,$data[‘query_type’]也为空值,导致后面的逻辑判断出错。
代码修复后
为了快速高效的解决问题,我这边统一修改为“?:”,如下:
$data['query_type'] = !empty($request['query_type']) ? intval($request['query_type']): 0;
$data['type'] = !empty($request['type']) ? intval($request['type']): 1;
$data['mer_id'] = !empty($request['mer_id']) ? intval($request['mer_id']): 0;
小结
要特别注意前端有时候会传空的情况。