$date1 = $date2 = new DateTime();
$date2->add(new DateInterval('P3Y'));
Agora $date1
e $date2
contenha a mesma data - daqui a três anos. Gostaria de criar duas datas separadas, uma que é analisada de uma string e outra com três anos adicionados a ela. Atualmente eu hackeei assim:
$date2 = new DateTime($date1->format(DateTime::ISO8601));
mas isso parece um truque horrendo. Existe uma maneira "correta" de copiar profundamente um objeto DateTime?
Clone a data com o operador clone :
Por padrão, os clones são rasos, mas suficientemente profundos para um DateTime. Em seus próprios objetos, você pode definir o
__clone()
método mágico para clonar as propriedades (ou seja, objetos filhos) que fazem sentido serem clonadas quando o objeto pai é alterado.(Não sei por que a documentação considera um bom exemplo da necessidade de clonar um objeto é o GTK. Quem usa o GTK no PHP?)
fonte
O PHP 5.5.0 introduziu DateTimeImmutable . adicionar e modificar métodos dessa classe retornam novos objetos.
fonte
DateTime
com aDateTimeImmutable
. Há pelo menosIntlDateFormatter::formatObject
que não gosta de imutáveis (retorna emfalse
vez da string formatada).DateTime
objeto em um loop: D Esta muito bem resolvido ...TLDR:
(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":
clone
palavra-chave faz uma cópia rasa regular - basta para este caso (por que => veja abaixo)()
avalia a expressão retornando o objeto recém-criado porclone
->modify()
é, portanto, chamado e modifica o novo objetoDateTime::modify(...)
docs:$date2
agora contém o clone / cópia recém-criado e modificado, enquanto$date1
permanece inalteradoPor 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:
saídas:
portanto, não há referências, apenas tipos simples => não há necessidade de copiar em profundidade .
fonte
Você deve mudar
DateTime
paraDateTimeImmutable
então você pode chamar qualquer método no
DateTime
sem se preocupar com isso mudarfonte
add
emdate2
alterações do valor dodate1
e não há maneira de copiar o valor daDateTime
variável, a menos que você tem umDateTimeImmutable