2014-12-15 8 views
5

Dlaczego w tym kodzie mój obiekt DateTime został skopiowany przez odniesienie?
Oto mój kod:PHP - Dlaczego obiekt DateTime jest kopiowany przez odniesienie w moim kodzie?

<?php 

date_default_timezone_set('UTC'); 

$dt1 = new \DateTime('2015-03-15'); 
$dt2 = $dt1; 
$dt2 = $dt2->modify('-1 year'); 

echo $dt1->format('c') . PHP_EOL; 
echo $dt2->format('c'); 

?> 

Spodziewałem:

2015-03-15T00:00:00+00:00 
2014-03-15T00:00:00+00:00 

Ale mam to:

2014-03-15T00:00:00+00:00 
2014-03-15T00:00:00+00:00 
+3

Musisz użyć klonu '$ dt2 = clone $ dt1;' – vaso123

+0

Jeśli użyjesz klasy 'DateTimeImmutable' to zadziała, zachowuje się dokładnie tak samo jak klasa' DateTime', ale nigdy nie modyfikuje samej siebie, ale zwraca nowy obiekt zamiast. – Daan

Odpowiedz

5

To z powodu tej linii

$dt2 = $dt1; 

Variabl es get copied, obiekty się odwołują.

Zobacz to na odpowiedź z przykładami - https://stackoverflow.com/a/6257203/1234502

powinien być w stanie rozwiązać ten problem z clone

+0

'Zmienne są kopiowane, obiekty się odwołują', niezupełnie dokładne –

+0

Naprawdę? Myślałem, że to właśnie dzieje się w php. – Pankucins

+3

Tak, ale "zmienne" i "obiekty" nie są różnymi rzeczami. Powinieneś powiedzieć wartości/surowe typy i obiekty (jak napisano w odpowiedziach, o których wspomniałeś). –

0

Rozważmy następujący tekst z PHP Objects and references page:

Od PHP 5, zmienna obiektowa nie zawiera już samego obiektu jako wartości. Zawiera tylko identyfikator obiektu, który pozwala obiektom na znalezienie właściwego obiektu.

Zasadniczo Twój $dt2 = $dt1; jest po prostu kopiowaniem odniesienia do obiektu, a nie jego zawartości; zobacz odpowiedź @lolka_bolka na odpowiednie środki, za pomocą których można wykonać to zadanie.

Powiązane problemy