You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP中date->modify与date_add函数返回结果一致的原因探究

为什么两次DateTime操作的返回结果相同?

问题根源:DateTime是引用类型,修改方法会直接改变原对象

PHP里的DateTime对象属于引用类型,不是值类型。当你调用modify()、date_add()(或add())这类方法时,这些方法会直接修改调用它们的原对象本身,而方法的返回值只是原对象的引用,并不是一个新创建的独立对象。

看你的第一段代码:

  1. $tomorrow = $today->modify('+1 day'); —— 这里modify直接把$today的日期改成了+1天,然后返回$today的引用赋值给$tomorrow,所以$tomorrow和$today指向同一个对象。
  2. 接着$enDt = date_add($today, $interval); —— date_add又在已经被修改过的$today(也就是+1天后的日期)基础上再加7天,同样返回$today的引用给$enDt,所以$enDt也指向同一个对象。

最终$tomorrow、$enDt、$today都是同一个对象,自然它们的日期结果完全相同。

第二段代码的逻辑完全一致:两次date_add都是直接修改$today,返回的引用赋值给两个变量,所以结果相同。

正确的写法:克隆原对象再修改

如果要得到基于原$today的不同日期,需要先通过clone关键字复制出一个独立的新对象,再对新对象进行修改,这样就不会影响原对象和其他克隆对象:

针对第一段代码的修正:

$today = new \DateTime(date('Y-m-d'));
// 克隆$today后再修改,不影响原对象
$tomorrow = (clone $today)->modify('+1 day');

$interval = new \DateInterval('P7D');
// 克隆原$today后再加7天
$enDt = (clone $today)->add($interval);

var_dump($tomorrow->format('d-m-Y'), $enDt->format('d-m-Y'));

针对第二段代码的修正:

$today = new \DateTime(date('Y-m-d'));
$interval1 = new \DateInterval('P1D');
// 克隆原对象后添加间隔
$tomorrow = (clone $today)->add($interval1);

$interval2 = new \DateInterval('P7D');
$enDt = (clone $today)->add($interval2);

var_dump($tomorrow, $enDt);
var_dump($tomorrow->format('d-m-Y'), $enDt->format('d-m-Y'));

这样$tomorrow是原日期+1天,$enDt是原日期+7天,两者结果就会不同了。

内容的提问来源于stack exchange,提问作者Giovanni Di Meglio

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 12:17:20