IT

DateTime에서 어떻게 딥 카피를 받습니까?

lottoking 2020. 7. 25. 10:18
반응형

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에는 DateTime이 도입되었습니다 . 이 클래스의 메소드를 추가 하고 수정 하면 새 객체가 반환됩니다.

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

TLDR :

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

(얕은 카피는 enaugh- Deep복사 DateTime은 (현재) 의미가 없습니다 )

그렇게 간단합니다 :)

"php는 다른 날짜 / 시간에서 날짜 / 시간을 생성합니다":

  1. clone키워드는 상당한으로 만드는 얕은의 사본을-enaugh 을이 경우에 (=> 아래 참조 이유)
  2. 감싸면로 ()새로 생성 된 object-를 반환하는 표현식 평가됩니다.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변경에 대해 걱정하지 않고 모든 메소드를 호출 할 수 있습니다.

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

반응형