Почему я не могу получить доступ к 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.

574   4  

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

    Ничего не найдено.