2014-10-08 4 views
1

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

// 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 

На данный момент, право все в. Теперь я передаю эти DateTimes в другую функцию, в которой я использую 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 

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

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

+1

Объекты (в основном) переданы по ссылке. См. Здесь для получения дополнительной информации: http://php.net/manual/en/language.oop5.references.php – Steve

ответ

3

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

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

+0

из ссылки oop «Один из ключевых моментов PHP 5 ООП, который часто упоминается, заключается в том, что« объекты по умолчанию ссылается по ссылкам ». Это не совсем так». – astroanu

2

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

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

$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 
Смежные вопросы