Почему я не могу получить доступ к дате DateTime-> в классе DateTime PHP? Это ошибка?

Использование класса DateTime , если я пытаюсь запустить следующий код.

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

Я верну это сообщение об ошибке

 Notice: Undefined property: 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('Ymd H:i:s'); 

Помимо использования DateTime::format() вы можете получить доступ к свойству с помощью отражения:

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

Это немного быстрее, чем использование format() потому что format() форматирует timestring, который уже был отформатирован. Особенно, если вы делаете это много раз в цикле.

Однако это не регулярное поведение PHP. Bugreport уже был зарегистрирован как @Nile, упомянутый в комментариях выше.

Как отметили другие ответы, это проблема с PHP, которая не var_dump() на сегодняшний день, но если это «побочный эффект» var_dump() я не уверен.

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

Я уверен, что если бы свойства DateTime должны были использоваться нами, были бы доступны. Но, как и многие внутренние классы, их нет, и вы не должны полагаться на «хакерские» или «глючные» методы для исправления кода. Вместо этого вы должны использовать их API .

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

Если вы не удовлетворены, вы можете расширить класс или, возможно, использовать Carbon, который расширяет его для вас.

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

Если вы знаете, как var_dump() создает поддельный вывод объекта, посмотрите на __debugInfo()

Если вы просто используете 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, и вы снова получите ошибку.