$date1 = $date2 = new DateTime();
$date2->add(new DateInterval('P3Y'));
Ahora $date1y $date2contienen 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
DateTimepor unDateTimeImmutable. Hay al menosIntlDateFormatter::formatObjectque no le gustan los inmutables (devoluciones enfalselugar de la cadena formateada).DateTimeobjeto 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":
clonepalabra 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:$date2ahora contiene el clon / copia recién creado y modificado, mientras que$date1permanece 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
DateTimeaDateTimeImmutableentonces puedes llamar a cualquier método en el
DateTimesin preocuparte de que cambiefuente
adddedate2cambios en el valor dedate1y no hay manera de copiar el valor deDateTimela variable a menos que tenga unaDateTimeImmutable