Dlaczego nie mogę uzyskać dostępu do DateTime-> date w klasie DateTime PHP?

95

Korzystając z DateTimeklasy, jeśli spróbuję uruchomić następujący kod:

$mydate = new DateTime();
echo $mydate->date;

Otrzymam ten komunikat o błędzie

Uwaga: Niezdefiniowana właściwość: DateTime :: $ date ...

Co nie ma sensu, ponieważ podczas uruchamiania var_dump()zmiennej $mydatewyraźnie pokazuje, że ta właściwość istnieje i jest publicznie dostępna:

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)

Czy to błąd w PHP, czy robię coś źle? Używam PHP 5.4.3.

okey_on
źródło
1
Dobre pytanie. Przez chwilę myślałem, że nie rozumiem ... nic.
regularmike

Odpowiedzi:

148

To znany problem .

var_dump()Dostępność daty jest w rzeczywistości efektem ubocznym wsparcia tutaj - [email protected]

Z jakiegoś powodu nie powinieneś mieć dostępu do nieruchomości, ale var_dumpi tak ją pokazuje. Jeśli naprawdę chcesz uzyskać datę w tym formacie, użyj DateTime::format()funkcji.

echo $mydate->format('Y-m-d H:i:s');
Jeremy
źródło
1
Dlaczego nie chciałoby się tego dokładnego formatu? Jest to taki sam format dat jak MySQL.
Elia Iliashenko
@HelgaIliashenko Nie jestem pewien, czy rozumiem. Nigdy nie powiedziałem, że nikt nie chciałby tego dokładnego formatu.
jeremy
To jest to samo, jeśli używasz var_dump lub print_r.
AndyGaskell
15

Oprócz wywoływania DateTime::format()możesz uzyskać dostęp do właściwości za pomocą refleksji:

<?php

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

Jest to nieco szybsze niż używanie, format()ponieważ format()formatuje synchronizację czasu, która została już sformatowana. Zwłaszcza jeśli robisz to wielokrotnie w pętli.

Jednak nie jest to normalne zachowanie PHP. Zgłoszenie błędu zostało już zgłoszone jako @Nile, o którym mowa w komentarzach powyżej.

hek2mgl
źródło
Jak to przestało działać w PHP 7.4? Wersja 7.2 sandbox.onlinephpfunctions.com/code/ ... 7.4 - Błąd sandbox.onlinephpfunctions.com/code/ ...
TechCare99
@ TechCare99 :) Myślę, że to nigdy nie powinno tak działać, to był hack. Musisz sprawdzić wersję 7.4, aby znaleźć alternatywę, obecnie nie robię dużo php, ale sprawdzę to. Dzięki, że dałeś mi znać!
hek2mgl
2

Jak zauważono w innych odpowiedziach, jest to problem z PHP, który na dzień dzisiejszy nie został rozwiązany, ale jeśli jest to „efekt uboczny”, var_dump()nie jestem tego taki pewien.

echo ((array) new DateTime())['date']; // Works in PHP 7.

Jestem pewien, że gdyby właściwości tego, DateTimegdzie miały być przez nas wykorzystane, zostałyby udostępnione. Ale jak wielu klas wewnętrznych są nie i nie należy polegać na „Hacky” lub metody „Glitchy” naprawić swój kod. Zamiast tego powinieneś użyć ich API .

echo (new DateTime())->format('Y-m-d H:i:s');

Jeśli nie jesteś usatysfakcjonowany, możesz przedłużyć klasę lub użyć Carbon, który ją przedłuży.

echo (new Carbon())->toDateTimeString();

Jeśli zastanawiasz się, jak var_dump()tworzy fałszywe wyjście obiektu, spójrz na__debugInfo()

Xorifelse
źródło
2

Właściwość DateTime jest chroniona.

Możesz wyświetlić datę za pomocą funkcji formatowania.

<?php

try {
    $time = new DateTime();
    echo($time->format("Y-m-d H:i:s"));
} catch (Exception $e) {
}

Lub możesz przekonwertować na tablicę:

<?php

try {
    $time = (array) new DateTime();
    var_dump($time["date"]);
} catch (Exception $e) {
}
filipe
źródło
Chciał wiedzieć, dlaczego nie mógł uzyskać dostępu do właściwości date obiektu DateTime ... Gdzie widzisz, że chciał sformatować zapisane wartości Datetime? „Ymd H: i: s” to format w którym data jest domyślna!
filipe
Konwersja obiektu na tablicę - jak sugerujesz - jest prawdopodobnie najłatwiejszym sposobem.
Jeffz
0

Jeśli po prostu użyjesz var_Dump przed zapytaniem o datę właściwości, wszystko działa dobrze:

$mydate = new DateTime();
var_Dump($mydate);
echo '<br>';
echo $mydate->date;

Zapewnia to:

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

Widzisz więc, że data właściwości istnieje nawet dla obiektu. Nie rozumiem tego zachowania. Po prostu zakomentuj var_Dump, a ponownie pojawi się błąd.

Sascha
źródło
error_reporting (0); echo date ("Ymd H: i: s", strtotime ($ mydate-> date));
Kaushik Das