Почему мои переменные передаются по ссылке?

Я создал функцию, которая создала две даты и времени на основе первой:

// initial datetime (for test)
$dt = new \Datetime;
$dt->setDate(2012, 9, 5);

// splitting into 2 different datetimes
$dates = $this->defineLimitsByDate($dt);

// $dates[0] = 2011-07-01
// $dates[1] = 2012-09-01

На данный момент все правильно. Теперь я передаю эти datetime в другую функцию, в которой я использую while цикл, который увеличивает первую дату, пока она не достигнет второй:

// now I use the 2 datetimes into a function...
$dateKeys = $this->generateDateKeys($dates[0], $dates[1]);

// and the function seems to modify them outside itself !
// $dates[0] = 2012-10-01
// $dates[1] = 2012-09-01

Кажется, что цикл while внутри моей функции generateDateKeys не локально изменяет параметры. Это изменяет значение $ date вне функции. Но я никогда не использую передачу ссылок.

Может ли кто-нибудь просветить меня об этом?

1

Решение

PHP передает все объекты по ссылке, по умолчанию.

Больше информации здесь: http://php.net/manual/en/language.oop5.references.php

3

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

Как заметили другие, все объекты в PHP передаются по ссылке.

Если вы хотите изменить объект, сохранив оригинал, вы должны использовать ключевое слово клон.

$originalDate = new \DateTime;
$originalDate->setDate(2010,1,1);

$newDate = clone $originalDate;
$newDate->addYears(1); // pseudo function

// first date is still 2010.01.01, second is 2011.01.01
2

По вопросам рекламы [email protected]