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는 다른 날짜 / 시간에서 날짜 / 시간을 생성합니다":
clone
키워드는 상당한으로 만드는 얕은의 사본을-enaugh 을이 경우에 (=> 아래 참조 이유)- 감싸면로
()
새로 생성 된 object-를 반환하는 표현식 이 평가됩니다.clone
->modify()
따라서 호출되어 새 객체를 수정합니다.DateTime::modify(...)
문서 :메소드 체인에 대한 DateTime 오브젝트 또는 실패시 FALSE를 리턴합니다.
$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
'IT' 카테고리의 다른 글
Android : AsyncTask의 onPreExecute ()에 전달 변수를 전달하는 방법은 무엇입니까? (0) | 2020.07.25 |
---|---|
자바 펼쳐를 사용하여 링크를 만들려면 어떻게 사용합니까? (0) | 2020.07.25 |
각도 파일 업로드 (0) | 2020.07.25 |
Android- 가로 모드의 에뮬레이터, 화면이 회전하지 (0) | 2020.07.24 |
카트리지 쓰기 또는 무시 (0) | 2020.07.24 |