$date1 = $date2 = new DateTime();
$date2->add(new DateInterval('P3Y'));
Maintenant $date1
et $date2
contiennent la même date - dans trois ans. Je voudrais créer deux datetimes séparés, l'un qui est analysé à partir d'une chaîne et l'autre avec trois ans ajoutés. Actuellement, je l'ai piraté comme ceci:
$date2 = new DateTime($date1->format(DateTime::ISO8601));
mais cela semble être un hack horrible. Existe-t-il un moyen "correct" de copier en profondeur un objet DateTime?
Clonez la date avec l' opérateur de clonage :
Les clones sont peu profonds par défaut, mais suffisamment profonds pour un DateTime. Dans vos propres objets, vous pouvez définir la
__clone()
méthode magique pour cloner les propriétés (c'est-à-dire les objets enfants) qu'il est logique de cloner lorsque l'objet parent change.(Je ne sais pas pourquoi la documentation pense qu'un bon exemple de besoin de cloner un objet est GTK. Qui utilise GTK en PHP?)
la source
PHP 5.5.0 a introduit DateTimeImmutable . Les méthodes d' ajout et de modification de cette classe renvoient de nouveaux objets.
la source
DateTime
avec unDateTimeImmutable
. Il y a au moinsIntlDateFormatter::formatObject
ça n'aime pas les immuables (retournefalse
au lieu de la chaîne formatée).DateTime
objet dans une boucle for: D Cela l'a bien résolu ...TLDR:
(La copie superficielle est enaugh - La copie profonde de DateTime n'a (actuellement) aucun sens )
Aussi simple que cela :)
Explication "php crée un objet datetime à partir d'un autre datetime":
clone
mot-clé fait une copie régulière superficielle - enaugh pour ce cas (pourquoi => voir ci-dessous)()
évalue l'expression renvoyant l'objet nouvellement créé enclone
->modify()
est donc appelé et modifie le nouvel objetDateTime::modify(...)
docs:$date2
contient maintenant le clone / copie nouvellement créé et modifié, tout en$date1
restant inchangéPourquoi vous n'avez pas besoin de copier en profondeur ici:
La copie / clonage profond n'est nécessaire que lorsque vous devez copier des cibles de propriétés qui sont des références , mais ceci:
les sorties:
il n'y a donc pas de références, juste des types simples => pas besoin de copier en profondeur .
la source
Vous devriez changer votre
DateTime
enDateTimeImmutable
alors vous pouvez appeler n'importe quelle méthode sur le
DateTime
sans vous soucier du changementla source
add
sur lesdate2
changements de la valeurdate1
et il n'y a aucun moyen de copier la valeur deDateTime
variable , sauf si vous avez unDateTimeImmutable