TLDR:
$date1 = new DateTime();
$date2 = (clone $date1)->modify('+3 years');
(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":
- La
clonepalabra clave hace una copia superficial regular , aprobada para este caso (por qué => ver más abajo)
- Envolviéndolo con
()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:
Devuelve el objeto DateTime para el encadenamiento de métodos o FALSE en caso de error.
$date2ahora contiene el clon / copia recién creado y modificado, mientras que $date1permanece sin cambios
Por 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:
class TestDateTime extends DateTime{
public function test(){
//*this* way also outputs private variables if any...
var_dump( get_object_vars($this) );
}
}
$test = (new TestDateTime())->test();
salidas:
array(3) {
["date"]=>
string(26) "2019-08-21 11:38:48.760390"
["timezone_type"]=>
int(3)
["timezone"]=>
string(3) "UTC"
}
por lo que no hay referencias, solo tipos simples => no es necesario realizar una copia profunda .