Webtron Webtron - 1 year ago 72
PHP Question

PHP - Adding and Subtracting Days Weird Bug with DateInterval

I am trying to add and subtract # of days to a date using

, but I get some weird results. I assume this is an easy answer I am just not versed enough in PHP to know why.

Here is my code:

$y = new DateTime('2016-05-17');
$z2 = 7;
$tempy = $y;
$tempy->sub(new DateInterval('P' . $z2 . 'D'));
$startdate = date_format($tempy, "Y-m-d");
$y->add(new DateInterval('P' . $z2 . 'D'));
$enddate = date_format($y, "Y-m-d");
echo "Start: " . $startdate . " End: " . $enddate . "\r\n";

This is the result:

Start: 2016-05-10 End: 2016-05-17

It looks like even though I use a temporary variable
for the start date it still modifies it and the end date is off.

Expected results:

Start: 2016-05-10 End: 2016-05-24

Answer Source

When you do :

$tempy = $y;

You create a pseudo reference to the first object, you don't actually copy it. To do so you need to use the clone keyword :

$tempy = clone $y;

Now things will work as you expect. Without cloning, when you modify $tempy it will also modify $y

EDIT : Adding link to manual about this (from @Devon's answer) http://php.net/manual/en/language.oop5.references.php