2010-04-05 4 views
82
$date1 = $date2 = new DateTime(); 
$date2->add(new DateInterval('P3Y')); 

이제 $date1$date2에는 3 년 후에 같은 날짜가 포함됩니다. 두 개의 별도의 datetimes를 만들고 싶습니다. 하나는 문자열에서 파싱되고 하나는 3 년이 추가 된 것입니다. 현재 다음과 같이 해킹했습니다.DateTime 객체를 어떻게 깊게 복사합니까?

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

하지만 끔찍한 해킹처럼 보입니다. DateTime 객체를 완전 복사하는 "올바른"방법이 있습니까?

답변

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

업데이트 : 복사보다는 기존 DT 객체를 참조, clone하지 = 사용하려면

.

+10

변경 ,하지만 지금은 DateTime이 내가 다시 호출 할 수없는 일부 불투명 한 API에서 반환된다고 가정합니다. 예를 들어, 고객이 다음에 주문할 수있는 DateTime을 반환하는 주문을 처리하는 함수가 있습니다. 복사본을 만드는 함수를 호출하면 원하지 않는 부작용이 발생합니다. –

+0

실제로 테스트하지는 않았지만 php.net에서 PHP 5.3 이상에서만 사용 가능하다고 언급되었습니다. –

+0

@hugo : 예, DateTime 클래스에는 PHP 5.3이 필요합니다. –

74

복제하려면 clone 연산자 날짜 :

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

클론은 기본적으로 얕은하지만 날짜 시간만큼 깊은이다. 자신의 개체에서 부모 개체가 변경 될 때 복제 할 수있는 속성 (예 : 자식 개체)을 복제하는 __clone() 마법 메서드를 정의 할 수 있습니다.

(문서 개체를 복제 할 필요가 좋은 예는 PHP에 GTK를 사용 GTK.라고 생각하는 이유는 확실하지 않다?)

+1

답변 해 주셔서 감사합니다.하지만 DateTime에 충분히 깊이 있다는 것을 어떻게 알 수 있습니까? 어떤 속성이 참조로 남아 있고 값으로 복사됩니까? 예를 들어 시간과 시간대를 변경할 수 있으며 클론에 영향을 미치지 않습니다. – David

+1

@David : 시도했기 때문에 DateTime에 충분히 깊다는 것을 알고 있으며, 저에게는 효과적이었습니다. 나는 표준 시간대 나 날짜를 변경하려고하지 않았습니다. – rjmunro

+3

Xdebug를 사용하면 var_dump ($ date1)에 'date'=> string, 'timezone_type'=> int & 'timezone'=> 문자열이 포함되어 있다고보고됩니다. 어떤 배열이나 객체를 포함하지 않는 것처럼 보이기 때문에 기본 스칼라 만 있으면 얕은 복제가 좋을 것입니다. –

30

PHP 5.5.0은 DateImmutable을 소개했다. addmodify이 클래스의 메서드는 새 객체를 반환합니다.

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

불행하게도'DateTime'을'DateTimeImmutable'로 바꿀 수는 없습니다.적어도 immutable을 좋아하지 않는'IntlDateFormatter :: formatObject'가 있습니다 (형식화 된 문자열 대신'false'를 반환합니다). – user276648

+1

오! 나는 오랫동안 그것을 꿈꿔 왔지만 어떻게 든 이것이 존재한다는 것을 결코 알지 못했다. 그리고 5.5에서 끝까지 ... – Ben

+2

일부 멍청한 놈처럼 for 루프에서 내'DateTime' 객체를 수정하여 객체 지향적 인 함정을 만났습니다 : D 멋지게 해결했습니다 ... – Wilt

0

당신은 변경해야합니다 당신의 DateTime 당신이 그것에 대해 걱정없이 DateTime에 어떤 메소드를 호출 할 수 다음

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

DateTimeImmutable 것은 내가 점을 입증하는 예에서 새로운 날짜 시간을 사용

+0

이것은 정말 다른 질문에 대한 답변입니다. –

+0

@BillyONeal 내가 어떻게 완전하게 설명하지 않았을 지 모르지만,이 문제의 원인은 date2에서'add '메소드를 호출하면'date1'의 값이 변경되어서 'DateTimeImmutable'을 가지고 있지 않으면'DateTime' 변수의 값을 복사하십시오. –

관련 문제