DateTime
클래스를 사용하여 다음 코드를 실행하려고하면 :
$mydate = new DateTime();
echo $mydate->date;
이 오류 메시지를 다시받을 게요
주의 : 정의되지 않은 속성 : DateTime :: $ date …
이는 var_dump()
변수 $mydate
에서 실행될 때이 속성이 존재하고 공개적으로 액세스 할 수 있음을 명확하게 보여 주기 때문에 의미가 없습니다 .
var_dump($mydate);
object(DateTime)[1]
public 'date' => string '2012-12-29 17:19:25' (length=19)
public 'timezone_type' => int 3
public 'timezone' => string 'UTC' (length=3)
이것은 PHP 내의 버그입니까 아니면 내가 뭘 잘못하고 있습니까? PHP 5.4.3을 사용하고 있습니다.
답변
이것은 알려진 문제 입니다.
사용 가능한 날짜는 실제로
var_dump()
여기에 대한 지원의 부작용입니다 – derick@php.net
어떤 이유로, 당신은 재산에 접근 할 수 var_dump
없어야 하지만 어쨌든 그것을 보여줍니다. 정말로 그 형식으로 날짜를 얻으려면 DateTime::format()
함수를 사용하십시오 .
echo $mydate->format('Y-m-d H:i:s');
답변
호출 외에도 DateTime::format()
리플렉션을 사용하여 속성에 액세스 할 수 있습니다.
<?php
$dt = new DateTime();
$o = new ReflectionObject($dt);
$p = $o->getProperty('date');
$date = $p->getValue($dt);
이미 포맷 된 타임 스트링을 포맷 format()
하기 때문에 format()
사용하는 것보다 약간 빠릅니다 . 특히 루프에서 여러 번 수행하는 경우.
그러나 이것은 PHP의 일반적인 동작이 아닙니다. 위의 주석에서 언급 한 @Nile로 이미 버그 보고서가 제출되었습니다.
답변
다른 답변에서 언급했듯이 오늘 현재 해결되지 않은 PHP 문제이지만 ‘부작용’ var_dump()
인지 확실하지 않습니다 ..
echo ((array) new DateTime())['date']; // Works in PHP 7.
내가 있는지에 대해 생각하는 것입니다 경우 의 속성을 DateTime
의미하는 곳이 우리가 사용하는 것이 가능하게 된 것이다. 그러나 많은 내부 클래스처럼 그들은 하지 당신은 당신의 코드를 해결하기 위해 “해키”또는 “glitchy”방법에 의존해서는 안됩니다. 대신 API 를 사용해야합니다 .
echo (new DateTime())->format('Y-m-d H:i:s');
만족스럽지 않은 경우 클래스를 확장하거나 이를 확장 하는 Carbon 을 사용할 수 있습니다.
echo (new Carbon())->toDateTimeString();
당신이 어떻게 var_dump()
개체의 가짜 출력을 생성하는 경우__debugInfo()
답변
DateTime의 날짜 속성은 보호됩니다.
포맷 기능으로 날짜를 표시 할 수 있습니다.
<?php
try {
$time = new DateTime();
echo($time->format("Y-m-d H:i:s"));
} catch (Exception $e) {
}
또는 배열로 변환 할 수 있습니다.
<?php
try {
$time = (array) new DateTime();
var_dump($time["date"]);
} catch (Exception $e) {
}
답변
속성 날짜를 물어 보기 전에 var_Dump 를 사용하면 모든 것이 정상적으로 작동합니다.
$mydate = new DateTime();
var_Dump($mydate);
echo '<br>';
echo $mydate->date;
이는 다음을 제공합니다.
object(DateTime)#1 (3) { ["date"]=> string(26) "2017-04-11 08:44:54.000000" ["timezone_type"]=> int(3) ["timezone"]=> string(16) "America/New_York" }
2017-04-11 08:44:54.000000
따라서 객체에 대해서도 속성 날짜가 존재 함을 알 수 있습니다. 이 행동을 이해할 수 없습니다. var_Dump를 주석 처리하면 오류가 다시 발생합니다.