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 协议》,转载必须注明作者和本文链接
六月的风
Junwind
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 7

优先级最低

1年前 评论

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

1年前 评论
Junwind (楼主) 1年前

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

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

1年前 评论

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

1年前 评论

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

1年前 评论

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

1年前 评论

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