PHP의 DateTime 클래스에서 DateTime-> date에 액세스 할 수없는 이유는 무엇입니까?


95

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을 사용하고 있습니다.


1
좋은 질문. 나는 내가 이해하지 못하는 것을 잠시 생각했다.
regularmike

답변:


148

이것은 알려진 문제 입니다.

사용 가능한 날짜는 실제로 var_dump()여기에 대한 지원의 부작용입니다 – derick@php.net

어떤 이유로, 당신은 재산에 접근 할 수 var_dump없어야 하지만 어쨌든 그것을 보여줍니다. 정말로 그 형식으로 날짜를 얻으려면 DateTime::format()함수를 사용하십시오 .

echo $mydate->format('Y-m-d H:i:s');

1
이 정확한 형식을 원하지 않는 이유는 무엇입니까? 날짜에 대한 MySQL과 동일한 형식입니다.
Elia Iliashenko 2015

@HelgaIliashenko 내가 이해하는지 잘 모르겠습니다. 이 정확한 형식을 원하지 않을 것이라고 말한 적이 없습니다.
jeremy

var_dump 또는 print_r을 사용하는 경우에도 동일합니다.
AndyGaskell 2019

15

호출 외에도 DateTime::format()리플렉션을 사용하여 속성에 액세스 할 수 있습니다.

<?php

$dt = new DateTime();
$o = new ReflectionObject($dt);
$p = $o->getProperty('date');
$date = $p->getValue($dt);

이미 포맷 된 타임 스트링을 포맷 format()하기 때문에 format()사용하는 것보다 약간 빠릅니다 . 특히 루프에서 여러 번 수행하는 경우.

그러나 이것은 PHP의 일반적인 동작이 아닙니다. 위의 주석에서 언급 한 @Nile로 이미 버그 보고서가 제출되었습니다.


2

다른 답변에서 언급했듯이 오늘 현재 해결되지 않은 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()


2

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) {
}

그는 DateTime 개체의 날짜 속성에 액세스 할 수없는 이유를 알고 싶었습니다. 저장된 Datetime 값의 형식을 지정하려는 위치는 어디입니까? "Ymd H : i : s"는 마녀의 형식이며 날짜는 기본값입니다!
filipe

객체에서 배열로 변환하는 것이 가장 쉬운 방법 일 것입니다.
Jeffz

0

속성 날짜를 물어 보기 전에 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를 주석 처리하면 오류가 다시 발생합니다.


error_reporting (0); echo date ( "Ymd H : i : s", strtotime ($ mydate-> date));
Kaushik Das
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.