복붙노트

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

PHP

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

다음 코드를 실행하려고하면 DateTime 클래스를 사용하십시오.

$mydate = new DateTime();
echo $mydate->date;

이 오류 메시지가 나옵니다.

변수 $ mydate에서 var_dump ()를 실행할 때이 속성이 존재하며 공개적으로 액세스 할 수 있음을 명확하게 보여주기 때문에 이해가되지 않습니다.

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. ==============================

    1.이는 알려진 문제입니다.

    이는 알려진 문제입니다.

    웬일인지, 당신은 그 속성에 접근 할 수 있다고 가정하지는 않지만, var_dump는 그것을 보여줍니다. 실제로 해당 형식으로 날짜를 가져 오려면 DateTime :: format () 함수를 사용하십시오.

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

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

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

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

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

    그러나 이것은 PHP의 일반적인 동작이 아닙니다. bugreport는 이미 @Nile이 위의 주석에 언급 된대로 제기되었습니다.

  3. ==============================

    3.다른 답변에서 언급했듯이, 현재 PHP로는 해결되지 않은 문제이지만 var_dump ()의 '부작용'이라면 그렇게 확신 할 수 없습니다.

    다른 답변에서 언급했듯이, 현재 PHP로는 해결되지 않은 문제이지만 var_dump ()의 '부작용'이라면 그렇게 확신 할 수 없습니다.

    echo ((array) new DateTime())['date']; // Works in PHP 7.
    

    필자가 확신 할 수있는 것은 DateTime의 속성이 우리가 사용하기로 의도 한 것이면 사용할 수있게되었을 것입니다. 그러나 많은 내부 클래스와 같지 않으므로 코드를 수정하기 위해 "hacky"또는 "glitchy"메서드에 의존해서는 안됩니다. 대신 API를 사용해야합니다.

    echo (new DateTime())->format('Y-m-d H:i:s');
    

    만족스럽지 않으면 클래스를 확장하거나 Carbon을 사용하여 확장 할 수 있습니다.

    echo (new Carbon())->toDateTimeString();
    

    var_dump ()가 어떻게 객체의 가짜 출력을 생성하는지 궁금하다면 __debugInfo ()를 살펴보십시오.

  4. ==============================

    4.프로퍼티 날짜를 물어보기 전에 var_Dump를 사용하면 모든 것이 올바르게 작동합니다.

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

  5. from https://stackoverflow.com/questions/14084222/why-cant-i-access-datetime-date-in-phps-datetime-class-is-it-a-bug by cc-by-sa and MIT license