我感觉我的方式围绕着原生于PHP的\ DateTime类,但我发现了一种特殊的习惯。
$date = new \DateTime(date('d-m-Y',time())); //this being todays date 21-03-2017
$first = $date->modify('first day of this month');
var_dump($first); //returns ["date"] => string(26) "2017-03-01..."
$last = $date->modify('last day of this month');
var_dump($first); //returns ["date"] => string(26) "2017-03-31..."
它似乎是通过引用分配的,因此稍后会被修改。我该如何防止这种情况。
答案 0 :(得分:1)
方法DateTime::modify(add和sub也是)修改类(不要创建新的类)。正如您在manual上看到的那样:
$date = new DateTime('2006-12-12');
$date->modify('+1 day');
echo $date->format('Y-m-d');//2006-12-13
当您使用新变量指定返回的日期时,您只需指定一个参考。这意味着两个变量都在寻找内存中的同一个对象。
$date = new DateTime('2006-12-12');
$nextDay = $date->modify('+1 day');
echo $date->format('Y-m-d');//2006-12-13
echo $nextDay->format('Y-m-d');//2006-12-13
如果您想更改DateTime
而不修改对象(创建新对象),请使用DateTimeImmutable
$date = new DateTimeImmutable('2006-12-12');
$nextDay = $date->modify('+1 day');
echo $date->format('Y-m-d');//2006-12-12
echo $nextDay->format('Y-m-d');//2006-12-13
另一种方法是使用clone
关键字:
$first = clone $last = new \DateTime(date('d-m-Y',time())); //this being todays date 21-03-2017
$first->modify('first day of this month');
var_dump($first);
$last->modify('last day of this month');
var_dump($last);
代码:https://3v4l.org/rO7Zd 结果:
object(DateTime)#2 (3) {
["date"]=>
string(26) "2017-03-01 00:00:00.000000"
["timezone_type"]=>
int(3)
["timezone"]=>
string(16) "Europe/Amsterdam"
}
object(DateTime)#1 (3) {
["date"]=>
string(26) "2017-03-31 00:00:00.000000"
["timezone_type"]=>
int(3)
["timezone"]=>
string(16) "Europe/Amsterdam"
}