date_add() изменяет 2 переменные в PHP, а не 1

Вот пример кода, который я использовал:

<?php 
date_default_timezone_set("Europe/London");
$date1 = date_create("2014-04-05");
$date2 = $date1;
date_add($date2, new DateInterval("P1M"));
echo "Date 1: ".date_format($date1, "Y-m-d")."<br/>";
echo "Date 2: ".date_format($date2, "Y-m-d")."<br/>";
?>

Результат для этого будет:

Date 1: 2014-05-05
Date 2: 2014-05-05

Я ожидал результата:

Date 1: 2014-04-05
Date 2: 2014-05-05

Как я могу получить ожидаемый результат и исправить это? Я могу использовать только PHP, HTML и CSS, поэтому, пожалуйста, не используйте jQuery или Javascript.

2 ответа

Решение

clone Ключевое слово это то, что вам нужно.

$date2 = clone $date1;

Когда объект клонируется, поверхностная копия всех свойств объекта. Любые свойства, которые являются ссылками на другие переменные, останутся ссылками.

Если ваш объект $date2 содержит ссылку на другой объект $date1 который он использует, и когда вы копируете родительский объект, вы хотите создать новый экземпляр этого другого объекта, чтобы реплика имела свою собственную отдельную копию.

Source

Это связано с тем, как объекты назначаются по ссылке начиная с PHP 5; после назначения изменения, внесенные в один объект, отражаются и в другом.

Общее решение заключается в клонировании объекта:

$date2 = clone $date1;

В этом случае вы также можете использовать DateTimeImmutable интерфейс (введен в 5.5), который создает новые экземпляры всякий раз, когда вы пытаетесь изменить его, например, используя ->add(),

$date1 = new DateTimeImmutable('2014-04-05');
$date2 = $date1;

$date2 = $date2->add(new DateInterval('P1M'));

echo "Date 1: ".date_format($date1, "Y-m-d")."<br/>";
echo "Date 2: ".date_format($date2, "Y-m-d")."<br/>";

Этот код можно сделать проще, сделав это:

$date1 = new DateTimeImmutable('2014-04-05');
$date2 = $date1->add(new DateInterval('P1M'));
Другие вопросы по тегам