source

Date Time 개체를 딥 복사하려면 어떻게 해야 합니까?

bestscript 2022. 12. 24. 20:36

Date Time 개체를 딥 복사하려면 어떻게 해야 합니까?

$date1 = $date2 = new DateTime();
$date2->add(new DateInterval('P3Y'));

지금이다$date1그리고.$date2지금으로부터 3년 후의 날짜가 포함되어 있습니다.문자열에서 구문 분석된 데이터 타임과 3년이 추가된 데이터 타임 두 개를 만들고 싶습니다.현재는 이렇게 해킹하고 있습니다.

$date2 =  new DateTime($date1->format(DateTime::ISO8601));

끔찍한 해킹으로 보이는데요Date Time 개체를 자세히 복사하는 "올바른" 방법이 있습니까?

$date1 = new DateTime();
$date2 = new DateTime();
$date2->add(new DateInterval('P3Y'));

업데이트:

기존 DT 개체를 참조하지 않고 복사하려면clone,것은 아니다.=.

$a = clone $b;

복제 연산자를 사용하여 날짜를 복제합니다.

$date1 = new DateTime();
$date2 = clone $date1;
$date2->add(new DateInterval('P3Y'));

클론은 기본적으로 얕지만 DateTime에 충분히 깊이가 있습니다.독자적인 오브젝트에서는,__clone()상위 개체가 변경되었을 때 복제할 수 있는 속성(예: 하위 개체)을 복제하는 매직 메서드입니다.

(개체를 복제할 필요가 있는 좋은 예가 GTK인 이유는 잘 모르겠습니다.PHP에서 GTK를 사용하는 사용자)

PHP 5.5.0에서는 DateTimeImmptable이 도입되었습니다. 클래스의 메서드를 추가 및 수정하면 새 개체가 반환됩니다.

$date1 = new DateTimeImmutable();
$date2 = $date1->add(new DateInterval('P3Y'));

TLDR(PHP 5.5+/7.0.0+/8.0.0+):

사용: 원래 인스턴스:-는 변경되지 않습니다.

<?php
$date1 = new DateTimeImmutable(); // Immutable => VERY IMPORTANT
$date2 = $date1->modify('+3years');
// see that $date1 still has the original year
echo $date1->format('Y-m-d H:i:s'); // outputs 2022-05-01 12:59:50
echo PHP_EOL;
echo $date2->format('Y-m-d H:i:s'); // outputs 2025-05-01 12:59:50

BTW: 를 사용하는 경우Carbon또한 있다

PHP 문서: https://www.php.net/manual/en/class.datetimeimmutable.php

심플하게 :)

오래된 답변(다시 쓰기) (더 이상 추천하지 않음!) :

이전에는 얕은 복사로도 충분했습니다.Date Time 인스턴스를 쉽게 조사하여 값에 따라 복사되는 단순한 유형(참조가 없음)만 있는 것을 알 수 있었기 때문에 Date Time의 딥 복사에는 의미가 없었습니다.

그러나 다음 코드는 PHP7.4에서 작동하지 않습니다(향후 솔루션은 Reflection 클래스/오브젝트 근처가 될 가능성이 높습니다).

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();

출력에 사용

array(3) {
  ["date"]=>
  string(26) "2019-08-21 11:38:48.760390"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(3) "UTC"
}

레퍼런스는 없고 단순한 타입= > 딥 카피할 진짜 이유는 없지만, 앞으로는 사용하지 않는 것이 좋습니다.

변경하셔야 합니다.DateTime로.DateTimeImmutable

// from date time
$date = \DateTimeImmutable::createFromMutable($mutableDate)

그 후, 임의의 메서드를 호출할 수 있습니다.DateTime변화할 염려 없이

언급URL : https://stackoverflow.com/questions/2579458/how-do-i-deep-copy-a-datetime-object