为日期变量分配';引用';不恰当


Date variables being assigned with 'reference' improperly?

我正在经历一些对我来说似乎很奇怪的事情,希望对此有第二种看法。

似乎我的日期变量在分配期间应用了"参考",而它们不应该应用。

示例:

$date1 = date_create('2014-09-20');
$date2 = $date1;
date_add($date2,date_interval_create_from_date_string("1 month"));
// I would expect this to print "2014-09-20". However it is printing "2014-10-20"
echo date_format($date1,'Y-m-d') . "<br>";
//I would expect this to print "2014-10-20". It does so.
echo date_format($date2,'Y-m-d') . "<br>";

基本上,每当我更改$date2时,它也会更改存储在$date1中的值。

我疯了吗?这是恰当的行为吗?我的编译器有问题吗?php.ini中有什么?我只是不理解PHP语法中的一些非常简单的概念吗?

我在IIS 7.5.7600、Windows 7上使用PHP 5.3.28。通过Firefox 32或他们现在的最新版本访问页面。。。

我已经用"NewDatetime"/Add(NewDateInterval)方法和上面的示例中的date_create/date_Add进行了尝试。尝试先创建变量,然后分配它们。。同样的结果。尝试添加"&"只是想看看会发生什么。同样的结果。

我对相同的模式和使用int:没有任何问题

$int1 = 1;
$int2 = $int1;
$int2 = $int2 + 1;
echo "$int1 <br>"; //prints 1
echo "$int2 <br>"; //prints 2

它的行为就像在日期变量上有引用/指针,即使没有指定。

谢谢你的帮助。。

不,你没有疯,这就是行为,如果你想要一个单独的对象,这样它就不会反射,请使用clone

$date1 = date_create('2014-09-20');
$date2 = clone $date1; // clone $date1 object
date_add($date2,date_interval_create_from_date_string("1 month"));
echo date_format($date1,'Y-m-d') . "<br>"; // 2014-09-20

echo date_format($date2,'Y-m-d') . "<br>"; // 2014-10-20

它们确实引用了同一个对象。以下代码可以使用debug_zval_dump:提供一些见解

<?php
$date1 = date_create('2014-09-20');
$date2 = $date1;
$date3 = date_create('2014-09-20');
echo debug_zval_dump($date1, $date2, $date3);
?>

感谢大家的回答。

我想补充一点,现在用你的答案做了更多的阅读:

它之所以这样做,是因为DateTime不是本机数据类型,而是一个类。因此,当我们处理一个日期变量时,我们实际上是在处理一个类的实例。PHP中所有类对象的行为都是将指针分配给对象,而不是对象的副本。