У меня есть этот довольно простой код:
$start_date = new DateTime($post['start_date']); $end_date = $start_date->add(new DateInterval('P6M')); echo $start_date->getTimestamp(); // 1351836000 echo $end_date->getTimestamp(); // 1351836000
Конечно, оба заканчиваются как одна и та же временная метка, потому что добавление интервала дат влияет на исходный $ start_date. Итак, как я могу это сделать, чтобы сохранить исходный $ start_date еще 6 месяцев в другой переменной?
Я пробовал это без везения:
$start_date = new DateTime($post['start_date']); $start_date_actual = $start_date; $end_date = $start_date_actual->add(new DateInterval('P6M'))->getTimestamp();
Переменные содержат ссылки на объекты, а не сами объекты. Таким образом, присваивание дает вам больше переменных, указывающих на один и тот же объект, а не на несколько копий объекта.
Если вы хотите получить копию, используйте ключевое слово clone
:
$end_date = clone $start_date; $end_date->add(new DateInterval('P6M'));
Вы можете выбрать:
$start_date = new DateTime($post['start_date']); $end_date = new DateTime($post['start_date']); $end_date->add(new DateInterval('P6M'));
или
$start_date = new DateTime($post['start_date']); $end_date = clone $start_date; $end_date->add(new DateInterval('P6M'));
Клонировать дату начала, прежде чем изменять ее:
$start_date = new DateTime(); $end_date = clone $start_date; $end_date->add(new DateInterval('P6M')); echo $start_date->getTimestamp(); echo $end_date->getTimestamp();
Дополнительную информацию см. В руководстве.