我正在经历一些对我来说很奇怪的事情,希望对此有第二意见。
似乎我的日期变量正在应用'参考'在任职期间他们不应该。
示例:
$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或任何当前版本的#访问页面#他们已经到了...
我已尝试使用&#34; New Datetime&#34; / Add(New DateInterval)方法,并使用date_create / date_add,如上例所示。尝试先创建变量然后分配它们。相同的结果。尝试添加&#39;&amp;&#39;到任务只是为了看看会发生什么。结果相同。
我使用相同的模式并使用整数没有麻烦:
$int1 = 1;
$int2 = $int1;
$int2 = $int2 + 1;
echo "$int1 <br>"; //prints 1
echo "$int2 <br>"; //prints 2
就像在日期变量上有引用/指针一样,即使没有指定任何引用/指针。
感谢您的帮助..
答案 0 :(得分:1)
不,你不是疯了,这将是行为,如果你想要一个单独的对象,以便它不会反映,改为使用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
答案 1 :(得分:0)
他们确实引用了同一个对象。以下代码可以使用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);
?>
答案 2 :(得分:0)
感谢您的回答。
我想添加一些东西,现在已经用你的答案做了一些阅读:
它的行为方式是因为DateTime不是本机数据类型,而是一个类。因此,当我们处理日期变量时,我们真正处理的是类的实例。这种指向对象的指针,而不是对象的副本,是PHP中所有类对象的行为。