Warum kann ich in der DateTime-class von PHP nicht auf DateTime-> date zugreifen? Ist es ein Fehler?

Verwenden der DateTime class, wenn ich versuche, den folgenden Code auszuführen:

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

Ich werde diese Fehlermeldung erhalten

Hinweis: Nicht definierte Eigenschaft: DateTime :: $ date …

Das macht keinen Sinn, denn wenn var_dump() für die Variable $mydate , wird deutlich, dass diese Eigenschaft existiert und öffentlich zugänglich ist:

 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) 

Ist das ein Fehler in PHP oder mache ich etwas falsch? Ich benutze PHP 5.4.3.

   

Dies ist ein bekanntes Problem .

Das verfügbare Datum ist eigentlich ein Nebeneffekt der Unterstützung von var_dump() hier – derick@php.net

Aus irgendeinem Grund sollten Sie nicht auf die Eigenschaft var_dump können, aber var_dump zeigt sie trotzdem an. Wenn Sie das Datum in diesem Format wirklich DateTime::format() möchten, verwenden Sie die function DateTime::format() .

 echo $mydate->format('Ymd H:i:s'); 

Neben der Verwendung von DateTime::format() Sie auf die Eigenschaft über Reflection zugreifen:

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

Dies ist etwas schneller als die Verwendung von format() da format() einen Timestring formatiert, der bereits formatiert wurde. Vor allem, wenn Sie es oft in einer Schleife tun.

Dies ist jedoch kein normales Verhalten von PHP. Ein Bugreport wurde bereits als @Nile in den obigen Kommentaren angegeben.

Wie von den anderen Antworten angemerkt, ist es ein Problem mit PHP, das ab heute ungetriggers ist, aber wenn es ein “Nebeneffekt” von var_dump() bin ich mir nicht so sicher.

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

Ich bin mir sicher, dass die Eigenschaften von DateTime , die für uns bestimmt sind, verfügbar wären. Aber wie viele interne classn sind sie nicht und Sie sollten sich nicht auf “hacky” oder “glitchy” Methoden verlassen, um Ihren Code zu reparieren. Stattdessen sollten Sie ihre API verwenden .

 echo (new DateTime())->format('Ymd H:i:s'); 

Wenn Sie nicht zufrieden sind, können Sie die class erweitern oder vielleicht Carbon , das es für Sie erweitert.

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

Wenn Sie sich wundern, wie var_dump() eine falsche Ausgabe eines Objekts erstellt, casting __debugInfo() einen Blick auf __debugInfo()

Wenn Sie nur ein var_Dump verwenden, bevor Sie das Property-Datum fragen, funktioniert alles gut:

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

Dies liefert:

 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 

Sie sehen also, dass das Eigenschaftsdatum auch für das Objekt existiert. Ich kann dieses Verhalten nicht verstehen. Kommentieren Sie einfach die var_Dump und Sie erhalten den Fehler erneut.