Используя 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.
Ответы:
Это известная проблема .
По какой-то причине у вас не должно быть доступа к объекту, но
var_dump
он все равно отображается. Если вы действительно хотите получить дату в этом формате, используйтеDateTime::format()
функцию.echo $mydate->format('Y-m-d H:i:s');
источник
Помимо вызова
DateTime::format()
вы можете получить доступ к свойству с помощью отражения:<?php $dt = new DateTime(); $o = new ReflectionObject($dt); $p = $o->getProperty('date'); $date = $p->getValue($dt);
Это немного быстрее, чем использование,
format()
потомуformat()
что форматирует уже отформатированную временную строку. Особенно, если вы делаете это много раз подряд.Однако это не обычное поведение PHP. Сообщение об ошибке уже было отправлено как @Nile, упомянутый в комментариях выше.
источник
Как отмечается в других ответах, это проблема с PHP, которая на сегодняшний день не решена, но если это «побочный эффект»,
var_dump()
я не уверен ..echo ((array) new DateTime())['date']; // Works in PHP 7.
В чем я уверен, так это в том, что если бы свойства объекта
DateTime
where предназначались для использования нами, они были бы доступны. Но, как и многие внутренние классы, это не так, и вам не следует полагаться на «хакерские» или «глючные» методы для исправления кода. Вместо этого вы должны использовать их API .echo (new DateTime())->format('Y-m-d H:i:s');
Если вы не удовлетворены, вы можете расширить класс или, возможно, использовать Carbon, который расширяет его за вас.
echo (new Carbon())->toDateTimeString();
Если вам интересно, как
var_dump()
создается фальшивый вывод объекта, взгляните на__debugInfo()
источник
Свойство date 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) { }
источник
Если вы просто используете 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, и вы снова получите ошибку.
источник