PHP中date->modify与date_add函数返回结果一致的原因探究
为什么两次DateTime操作的返回结果相同?
问题根源:DateTime是引用类型,修改方法会直接改变原对象
PHP里的DateTime对象属于引用类型,不是值类型。当你调用modify()、date_add()(或add())这类方法时,这些方法会直接修改调用它们的原对象本身,而方法的返回值只是原对象的引用,并不是一个新创建的独立对象。
看你的第一段代码:
$tomorrow = $today->modify('+1 day');—— 这里modify直接把$today的日期改成了+1天,然后返回$today的引用赋值给$tomorrow,所以$tomorrow和$today指向同一个对象。- 接着
$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
相关产品推荐
相关产品推荐

