Mengapa saya tidak dapat mengakses DateTime-> date di kelas DateTime PHP?

95

Menggunakan DateTimekelas, 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.

okey_on
sumber
1
Pertanyaan bagus. Saya berpikir sejenak bahwa saya tidak mengerti ... apapun.
regularmike

Jawaban:

148

Ini adalah masalah umum .

Tanggal tersedia sebenarnya adalah efek samping dari dukungan untuk di var_dump()sini - [email protected]

Untuk beberapa alasan, Anda seharusnya tidak dapat mengakses properti tetapi tetap var_dumpmenunjukkannya. Jika Anda benar-benar ingin mendapatkan tanggal dalam format itu, gunakan DateTime::format()fungsinya.

echo $mydate->format('Y-m-d H:i:s');
jeremy
sumber
1
Mengapa orang tidak menginginkan format yang persis seperti ini? Ini adalah format yang sama dengan MySQL untuk tanggal.
Elia Iliashenko
@HelgaIliashenko Saya tidak yakin saya mengerti. Saya tidak pernah mengatakan orang tidak akan menginginkan format yang persis seperti ini.
jeremy
Ini sama jika menggunakan var_dump atau print_r.
AndyGaskell
15

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()karena format()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.

hek2mgl
sumber
2

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 DateTimemana 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()

Xorifelse
sumber
2

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) {
}
filipe
sumber
Dia ingin tahu mengapa dia tidak bisa mengakses properti tanggal dari objek DateTime ... Di mana Anda melihat dia ingin memformat nilai Datetime yang disimpan? "Ymd H: i: s" adalah format di witch tanggalnya secara default!
filipe
Konversi objek ke array - seperti yang Anda sarankan - mungkin adalah cara termudah untuk melakukannya.
Jeffz
0

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.

Sascha
sumber
error_reporting (0); tanggal gema ("Ymd H: i: s", strtotime ($ mydate-> tanggal));
Kaushik Das