Menggunakan DateTime
kelas, jika saya mencoba menjalankan kode berikut:
$mydate = new DateTime();
echo $mydate->date;
Saya akan mendapatkan kembali pesan kesalahan ini
Pemberitahuan: Properti tidak ditentukan: DateTime :: $ date ...
Yang tidak masuk akal karena saat dijalankan var_dump()
pada variabel $mydate
, ini dengan jelas menunjukkan bahwa properti ini ada dan dapat diakses publik:
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)
Apakah ini bug dalam PHP atau apakah saya melakukan kesalahan? Saya menggunakan PHP 5.4.3.
Jawaban:
Ini adalah masalah umum .
Untuk beberapa alasan, Anda seharusnya tidak dapat mengakses properti tetapi tetap
var_dump
menunjukkannya. Jika Anda benar-benar ingin mendapatkan tanggal dalam format itu, gunakanDateTime::format()
fungsinya.echo $mydate->format('Y-m-d H:i:s');
sumber
Selain menelepon,
DateTime::format()
Anda dapat mengakses properti menggunakan refleksi:<?php $dt = new DateTime(); $o = new ReflectionObject($dt); $p = $o->getProperty('date'); $date = $p->getValue($dt);
Ini sedikit lebih cepat daripada menggunakan
format()
karenaformat()
memformat timestring yang telah diformat. Apalagi jika Anda melakukannya berkali-kali dalam satu putaran.Namun ini bukan perilaku biasa PHP. Laporan bug telah diajukan sebagai @Nile yang disebutkan dalam komentar di atas.
sumber
Seperti dicatat oleh jawaban lain, ini adalah masalah dengan PHP yang belum terselesaikan hingga hari ini tetapi jika itu adalah 'efek samping'
var_dump()
saya tidak begitu yakin ..echo ((array) new DateTime())['date']; // Works in PHP 7.
Yang saya yakini adalah jika properti di
DateTime
mana dimaksudkan untuk digunakan oleh kami, properti itu akan tersedia. Tetapi seperti banyak kelas internal, mereka tidak demikian dan Anda tidak boleh mengandalkan metode "hacky" atau "glitchy" untuk memperbaiki kode Anda. Sebagai gantinya Anda harus menggunakan API mereka .echo (new DateTime())->format('Y-m-d H:i:s');
Jika Anda tidak puas, Anda dapat memperpanjang kelas atau mungkin menggunakan Karbon yang memperluasnya untuk Anda.
echo (new Carbon())->toDateTimeString();
Jika Anda bingung bagaimana
var_dump()
membuat hasil palsu dari suatu objek lihatlah__debugInfo()
sumber
Properti tanggal DateTime dilindungi.
Anda dapat menampilkan tanggal dengan fungsi format.
<?php try { $time = new DateTime(); echo($time->format("Y-m-d H:i:s")); } catch (Exception $e) { }
Atau Anda dapat mengonversi ke array:
<?php try { $time = (array) new DateTime(); var_dump($time["date"]); } catch (Exception $e) { }
sumber
Jika Anda hanya menggunakan var_Dump sebelum menanyakan tanggal properti, semuanya berfungsi dengan baik:
$mydate = new DateTime(); var_Dump($mydate); echo '<br>'; echo $mydate->date;
Ini memberikan:
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
Jadi Anda melihat tanggal properti ada bahkan untuk objek tersebut. Saya tidak dapat memahami perilaku ini. Cukup beri komentar var_Dump dan Anda akan mendapatkan kesalahan lagi.
sumber