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'));