[php] DateTime 객체를 어떻게 깊게 복사합니까?

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

이제 $date1$date2현재로부터 3 년 – 같은 날짜가 포함되어 있습니다. 두 개의 개별 날짜 시간을 만들고 싶습니다. 하나는 문자열에서 구문 분석되고 다른 하나는 3 년이 추가되었습니다. 현재 나는 다음과 같이 해킹했습니다.

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

그러나 그것은 끔찍한 해킹처럼 보입니다. DateTime 개체를 자세히 복사하는 “올바른”방법이 있습니까?



답변

$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은 DateTimeImmutable을 도입했습니다 . 이 클래스의 추가수정 메서드는 새 개체를 반환합니다.

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


답변

TLDR :

$date1 = new DateTime();
$date2 = (clone $date1)->modify('+3 years');

(Shallow copy is enaugh- Deep copy-ing DateTime is (current ) no sense )

그렇게 간단합니다 🙂

설명 “php create datetime object from another datetime”:

  1. clone키워드는 정기적으로 만드는 얕은의 사본을 – enaugh을이 경우에 (=> 아래 참조 이유)
  2. 래핑 ()하면 새로 생성 된 객체를 반환하는 표현식이 다음과 같이 평가됩니다.clone
  3. ->modify() 따라서 호출되고 새 개체를 수정합니다.
  4. DateTime::modify(...) 문서 :

    메서드 체인에 대한 DateTime 개체를 반환하고 실패하면 FALSE를 반환합니다.

  5. $date2이제 새로 생성 및 수정 된 클론 / 복사본이 포함되지만 $date1변경되지 않습니다.

여기 에 카피 가 필요하지 않은 이유 :

참조 인 속성의 대상을 복사해야하는 경우에만 전체 복사 / 복제가 필요 하지만 다음과 같습니다.

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변경에 대해 걱정하지 않고 모든 메서드를 호출 할 수 있습니다.


답변