我正在尝试修改作为引用传递的函数中的 DateTime 对象:
<?php
$date = new DateTime('2012-02-12');
for($n1 = 0; $n1 < 10; $n1++) {
$date->modify('first day of next month');
setDate($date, 15);
echo $date->format('Y-m-d') . "<br />'n";
}
function setDate(&$date, $day) {
$date->setDate($date->format('Y'), $date->format('m'), $day);
}
?>
但结果并不像预期的那样。我这个参考资料有问题吗?
编辑:预期成果:2012-03-152012-04-15...
具有上述函数的结果:2012-03-012012-04-01...
我的 PHP 不喜欢"嵌套月的第一天"位,但使用"+1 个月"。既然你绝对设定了这一天,我就不担心它不在第一个。或者,如果需要,您可以在进入循环之前将其设置为第一个。
所以,这对我有用。我添加了new DateTimeZone('America/New_York')
,这样它就不会再纠缠我未设置它(共享服务器)。并删除了通过引用传递(&
)位,因为现在所有对象在PHP中默认都是通过引用传递的。
<?php
$date = new DateTime('2012-02-12',new DateTimeZone('America/New_York'));
for($n1 = 0; $n1 < 10; $n1++) {
$date->modify('+1 month');
setDate($date, 15);
echo $date->format('Y-m-d') . "<br />'n";
}
function setDate($date, $day) {
$date->setDate($date->format('Y'), $date->format('m'), $day);
}
?>
您已经在传递对 DateTime 对象的引用。无需隐式传递 DateTime 实例作为引用。如果需要 DateTime 对象的副本,则需要使用 clone
关键字。
就结果而言,它在每个连续月份的第 15 个迭代中,阅读代码,我预计会是结果。