TLDR:
$date1 = new DateTime();
$date2 = (clone $date1)->modify('+3 years');
(Cópia superficial é enaugh - Profundo DateTime marcas-ing cópia (atualmente) não sentido )
Simples assim :)
Explicação "php create objeto datetime de outro datetime":
- A
clone
palavra-chave faz uma cópia rasa regular - basta para este caso (por que => veja abaixo)
- O agrupamento
()
avalia a expressão retornando o objeto recém-criado porclone
->modify()
é, portanto, chamado e modifica o novo objeto
DateTime::modify(...)
docs:
Retorna o objeto DateTime para encadeamento de método ou FALSE em falha.
$date2
agora contém o clone / cópia recém-criado e modificado, enquanto $date1
permanece inalterado
Por que você não precisa copiar em profundidade aqui:
A cópia / clone profunda é necessária apenas quando você precisa copiar destinos de propriedades que são referências , mas isso:
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();
saídas:
array(3) {
["date"]=>
string(26) "2019-08-21 11:38:48.760390"
["timezone_type"]=>
int(3)
["timezone"]=>
string(3) "UTC"
}
portanto, não há referências, apenas tipos simples => não há necessidade de copiar em profundidade .