$date1 = $date2 = new DateTime();
$date2->add(new DateInterval('P3Y'));
Ahora $date1
y $date2
contienen la misma fecha, dentro de tres años. Me gustaría crear dos fechas y horas separadas, una que se analiza a partir de una cadena y otra con tres años agregados. Actualmente lo he pirateado así:
$date2 = new DateTime($date1->format(DateTime::ISO8601));
pero eso parece un truco horrendo. ¿Existe una forma "correcta" de realizar una copia profunda de un objeto DateTime?
Clone la fecha con el operador de clonación :
Los clones son superficiales por defecto, pero lo suficientemente profundos para un DateTime. En sus propios objetos, puede definir el
__clone()
método mágico para clonar las propiedades (es decir, los objetos secundarios) que tienen sentido para ser clonadas cuando cambia el objeto principal.(No estoy seguro de por qué la documentación cree que un buen ejemplo de la necesidad de clonar un objeto es GTK. ¿Quién usa GTK en PHP?)
fuente
PHP 5.5.0 introdujo DateTimeImmutable . agregar y modificar métodos de esta clase devolver nuevos objetos.
fuente
DateTime
por unDateTimeImmutable
. Hay al menosIntlDateFormatter::formatObject
que no le gustan los inmutables (devoluciones enfalse
lugar de la cadena formateada).DateTime
objeto en un bucle for: D Esto lo resolvió muy bien ...TLDR:
(Copia superficial es enaugh - Profundo copia-ing DateTime marcas (en la actualidad) sin sentido )
Simple como eso :)
Explicación "php crea un objeto de fecha y hora desde otra fecha y hora":
clone
palabra clave hace una copia superficial regular , aprobada para este caso (por qué => ver más abajo)()
evalúa la expresión que devuelve el objeto recién creado porclone
->modify()
Por lo tanto, se invoca y modifica el nuevo objeto.DateTime::modify(...)
docs:$date2
ahora contiene el clon / copia recién creado y modificado, mientras que$date1
permanece sin cambiosPor qué no es necesario realizar una copia profunda aquí:
La copia / clonación profunda solo es necesaria cuando necesita copiar destinos de propiedades que son referencias , pero esto:
salidas:
por lo que no hay referencias, solo tipos simples => no es necesario realizar una copia profunda .
fuente
Deberías cambiar tu
DateTime
aDateTimeImmutable
entonces puedes llamar a cualquier método en el
DateTime
sin preocuparte de que cambiefuente
add
dedate2
cambios en el valor dedate1
y no hay manera de copiar el valor deDateTime
la variable a menos que tenga unaDateTimeImmutable