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