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