Laravel 10中日期组合比较结果异常问题求助
问题原因及解决办法
1. 运算符优先级踩坑
PHP 里赋值运算符 = 的优先级高于逻辑运算符 and,你写的代码:
$less3days = ($task->deadline_at->gte($today)) and ($task->deadline_at->lt($today->addDays(3)));
实际执行顺序是:
- 先执行
$less3days = ($task->deadline_at->gte($today)),把true赋值给$less3days - 后面的
and (...)逻辑结果不会覆盖变量,所以最终$less3days是true
解决:把 and 换成 &&,&& 的优先级高于 =,会先执行两边的逻辑判断再赋值:
$less3days = ($task->deadline_at->gte($today)) && ($task->deadline_at->lt($today->addDays(3)));
2. Carbon 对象的可变特性(额外隐藏坑)
Carbon 是可变对象,调用 $today->addDays(3) 会直接修改 $today 本身的值。你单独测试时调用了一次 addDays(3),此时 $today 已经变成了 2024-07-18,后面赋值时再调用 addDays(3),$today 会变成 2024-07-21,直接篡改了逻辑判断的基准日期。
解决:调用 copy() 方法创建副本再修改,避免污染原对象:
$less3days = ($task->deadline_at->gte($today)) && ($task->deadline_at->lt($today->copy()->addDays(3)));
最终修正后的代码
dump($today); // 2024-07-15 00:00:00.0 UTC (+00:00) dump($task->deadline_at); // 2024-08-03 00:00:00.0 UTC (+00:00) dump($task->deadline_at->gte($today)); // true dump($task->deadline_at->lt($today->copy()->addDays(3))); // false $less3days = ($task->deadline_at->gte($today)) && ($task->deadline_at->lt($today->copy()->addDays(3))); dump($task->id); dd($less3days); // 输出 false,符合预期
内容的提问来源于stack exchange,提问作者Petro Gromovo
相关产品推荐
相关产品推荐

