Чому я не можу отримати доступ до DateTime-> date у класі DateTime PHP?


94

Використовуючи 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
Гарне питання. Я на мить подумав, що не розумію ... нічого.
регулярний майк

Відповіді:


146

Це відома проблема .

var_dump()Наявність дати насправді є побічним ефектом підтримки тут - derick@php.net

З якоїсь причини ви не повинні мати доступ до власності, але var_dumpвсе одно показуєте її. Якщо ви дійсно хочете отримати дату в такому форматі, скористайтеся DateTime::format()функцією.

echo $mydate->format('Y-m-d H:i:s');

1
Чому б не хотіти саме цей формат? Це той самий формат, що і MySQL для дат.
Elia Iliashenko

@HelgaIliashenko Я не впевнений, що розумію. Я ніколи не казав, що ніхто не захоче саме такий формат.
jeremy

Це те саме, якщо використовується var_dump або print_r.
AndyGaskell

15

Окрім виклику, DateTime::format()ви можете отримати доступ до власності за допомогою відображення:

<?php

$dt = new DateTime();
$o = new ReflectionObject($dt);
$p = $o->getProperty('date');
$date = $p->getValue($dt);

Це трохи швидше, ніж використання, format()оскільки format()форматує строку часу, яка вже відформатована. Особливо, якщо ви робите це багато разів у циклі.

Однак це не є звичайною поведінкою PHP. Повідомлення про помилки вже подано як @Nile, згадане у коментарях вище.


2

Як зазначають інші відповіді, це проблема з 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()


2

Властивість дати 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) {
}

Він хотів знати, чому він не міг отримати доступ до властивості date об’єкта DateTime ... Де ви бачите, що він хотів відформатувати збережені значення Datetime? "Ymd H: i: s" - це формат, у якому дата за замовчуванням!
filipe

Перетворення об’єкта масиву - як ви пропонуєте - це, мабуть, найпростіший спосіб.
Джеффз,

0

Якщо ви просто використовуєте 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, і ви знову отримаєте помилку.


повідомлення про помилку (0); дата відлуння ("Ymd H: i: s", strtotime ($ mydate-> date));
Kaushik Das
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.