Korzystając z DateTime
klasy, 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 $mydate
wyraź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.
Odpowiedzi:
To znany problem .
Z jakiegoś powodu nie powinieneś mieć dostępu do nieruchomości, ale
var_dump
i tak ją pokazuje. Jeśli naprawdę chcesz uzyskać datę w tym formacie, użyjDateTime::format()
funkcji.echo $mydate->format('Y-m-d H:i:s');
źródło
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.
źródło
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,
DateTime
gdzie 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()
źródło
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) { }
źródło
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.
źródło