3

参照として渡された関数で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..。

4

2 に答える 2

2

既に DateTime オブジェクトへの参照を渡しています。DateTime のインスタンスを参照として暗黙的に渡す必要はありません。DateTime オブジェクトのコピーが必要な場合は、cloneキーワードを使用する必要があります。

結果に関しては、毎月 15 日以上繰り返されます。コードを読んで、これが結果になると予想していました。

于 2012-06-07T15:49:51.793 に答える
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);
    }
?>
于 2012-06-07T17:32:01.307 に答える