PHP DateTime - 修改引用

时间:2012-06-07 15:29:33

标签: php datetime reference

我正在尝试修改作为引用传递的函数中的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 ...

2 个答案:

答案 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);
    }
?>