if 中使用了 ?? 导致预料之外的结果

我在 if 判断中这样用了 ??

$ts = 1696993871;
if ($ts??0 <= time()) {  // $ts > time() 的
    var_dump(111);
}
// 我预料的结果是 false,应该是不会走到 if 判断中的, 实际打印出了 111

// 我单独打印下面,返回的是 1696993871
var_dump($ts??0 <= time());

其实执行时, 是这样的顺序

$ts ?? ( 0 <= time() ) // $ts 有值则等于自身值,没有取后面括号中的

我们可以这样改下 , 或者不用这种写法

if ( ($ts??0) <= time() ) { // 加括号,改变运算的优先级
    var_dump(111);
}

总结

看来,使用语法糖时,还是要慎重一些。

本作品采用《CC 协议》,转载必须注明作者和本文链接
六月的风
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 7

优先级最低

2周前 评论

这是一个感觉优先级高但实际优先级低的东西

2周前 评论
junwind (楼主) 2周前

www.php.net/manual/zh/language.ope...

??想成是赋值运算 就很容易记住了 赋值优先级没有比较运算高

2周前 评论

如 @4pmzzzzzzzzzz 所说,其实 $a??0 < time() 等价于 $b = isset($a) ? $a : 0 < time()$a 有值,$b$a; 若 $a 不存在,$btrue。三目运算、逻辑与、逻辑或是有返回值的。

2周前 评论

一般这种写法我都会加上括号,这样可读性也会高

2周前 评论

我也遇到过,主要还是和写sql一样当成最左原则了,就和四则与暗算没注意 */ 优先级比 +- 高一样。养成加括号习惯就好

2周前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!