我正在尝试修改作为引用传递的函数中的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-15 2012-04-15 ...
以上功能的结果: 2012-03-01 2012-04-01 ...
答案 0 :(得分:2)
您已经传递了对DateTime对象的引用。无需将DateTime实例作为引用隐式传递。如果需要DateTime对象的副本,则需要使用clone
关键字。
就结果而言,它会在每个连续月份的15个星期内进行迭代,在阅读代码时,我预计会成为结果。
答案 1 :(得分:2)
我的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);
}
?>