Почему я не могу получить доступ к DateTime->date в классе DateTime PHP? Это баг?
С помощью 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.
4 ответов:
это известная проблема.
дата доступна на самом деле является побочным эффектом поддержки
var_dump()здесь [email protected]по какой-то причине вы не должны иметь доступ к свойству, но
var_dumpпоказывает это в любом случае. Если вы действительно хотите получить дату в этом формате, используйте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, упомянутый в комментариях выше.
как отмечается в других ответах, это проблема с 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');если вы не удовлетворены, вы можете расширить класс или, возможно, использовать что расширяет его для вас.
echo (new Carbon())->toDateTimeString();если вы wounder как
var_dump()создает поддельный вывод объекта взгляните на__debugInfo()
Если вы просто использовать вложенностями прежде чем спросить дату собственности все работает хорошо:
$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, и вы снова получите ошибку.
Comments