2014-12-15 3 views
5

Perché in questo codice il mio oggetto DateTime è stato copiato in base al riferimento?
Ecco il mio codice:PHP - Perché l'oggetto DateTime è copiato per riferimento nel mio codice?

<?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'); 

?> 

mi aspettavo:

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

ma ho ottenuto questo:

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

È necessario utilizzare clone '$ dt2 = clone $ dt1;' – vaso123

+0

Se si utilizza la classe 'DateTimeImmutable' funzionerà, si comporta esattamente come la classe' DateTime' tranne che non si modifica mai ma restituisce un nuovo oggetto anziché. – Daan

risposta

5

E 'a causa di questa linea

$dt2 = $dt1; 

variabl vengono copiati, gli oggetti vengono referenziati.

Vedere questo per una risposta con esempi - https://stackoverflow.com/a/6257203/1234502

Dovreste essere in grado di risolvere questo problema con clone

+0

'Le variabili vengono copiate, gli oggetti vengono referenziati ', non proprio precisi –

+0

Davvero? Ho pensato che questo è ciò che accade in PHP. – Pankucins

+3

Sì, ma "variabili" e "oggetti" non sono cose diverse. Dovresti dire valori/tipi e oggetti grezzi (come scritto nelle risposte che hai citato) –

0

Si consideri il seguente testo da Objects and references page di PHP:

Dal PHP 5, un la variabile oggetto non contiene più l'oggetto stesso come valore. Contiene solo un identificatore di oggetto che consente agli oggetti di accesso di trovare l'oggetto reale.

Fondamentalmente, il tuo $dt2 = $dt1; sta semplicemente copiando il riferimento all'oggetto e non il suo contenuto; vedere la risposta di @lolka_bolka per i mezzi appropriati con cui eseguire questa attività.

Problemi correlati