Неправильно ли назначены переменные даты со ссылкой?

Я испытываю что-то, что мне кажется странным, хотелось бы получить второе мнение по этому поводу.

Кажется, что мои переменные даты применяют ‘ссылку’ во время присваивания, когда они не должны быть.

Пример:

$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?

Я использую PHP 5.3.28 на IIS 7.5.7600, Windows 7. Доступ к странице через Firefox 32 или любую другую версию текущей версии # они получили сейчас …

Я пробовал это с помощью метода «New Datetime» / Add (New DateInterval) и date_create / date_add, как в примере выше. Попытался сначала создать переменные, а затем назначить их. Те же результаты. Пробовал добавлять ‘&«к назначению просто посмотреть, что происходит. Тот же результат.

У меня нет проблем с тем же шаблоном и использованием целых:

$int1 = 1;

$int2 = $int1;

$int2 = $int2 + 1;

echo "$int1 <br>"; //prints 1

echo "$int2 <br>"; //prints 2

Он ведет себя так, как будто есть ссылки / указатели на дату переменную, хотя ни одна не указана.

Спасибо за любую помощь ..

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);
?>
0

Другие решения

Нет, вы не сошли с ума, это будет поведение, если вы хотите отдельный объект, чтобы он не отражался, используйте 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-20echo date_format($date2,'Y-m-d') . "<br>"; // 2014-10-20
1

Спасибо вам обоим за ваши ответы.

Что-то, что я хочу добавить к этому, теперь, используя ваши ответы, чтобы немного больше читать:

Причиной такого поведения является то, что DateTime не является собственным типом данных, а является классом. Поэтому, когда мы имеем дело с датой var, мы действительно имеем дело с экземпляром класса. Это назначение указателя на объект, а не его копии, является поведением для всех объектов класса в PHP.

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector