Perché non riesco ad accedere a DateTime-> date nella classe DateTime di PHP?


94

Utilizzando la DateTimeclasse, se provo a eseguire il codice seguente:

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

Riceverò questo messaggio di errore

Avviso: proprietà non definita: DateTime :: $ date ...

Il che non ha senso perché quando si esegue var_dump()sulla variabile $mydate, mostra chiaramente che questa proprietà esiste ed è accessibile pubblicamente:

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)

È un bug in PHP o sto facendo qualcosa di sbagliato? Sto usando PHP 5.4.3.


1
Buona domanda. Per un attimo ho pensato di non aver capito ... niente.
regularmike

Risposte:


147

Questo è un problema noto .

La data disponibile è in realtà un effetto collaterale del supporto var_dump()qui - derick@php.net

Per qualche motivo, non dovresti essere in grado di accedere alla proprietà ma lo var_dumpmostri comunque. Se vuoi davvero ottenere la data in quel formato, usa la DateTime::format()funzione.

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

1
Perché non si dovrebbe volere questo formato esatto? È lo stesso formato di MySQL per le date.
Elia Iliashenko

@HelgaIliashenko Non sono sicuro di aver capito. Non ho mai detto che uno non vorrebbe questo formato esatto.
jeremy

È lo stesso se si utilizza var_dump o print_r.
AndyGaskell

15

Oltre a chiamare DateTime::format()puoi accedere alla proprietà usando la reflection:

<?php

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

Questo è leggermente più veloce rispetto all'utilizzo di format()becauseformat() formatta una stringa temporale che è già stata formattata. Soprattutto se lo fai molte volte in un ciclo.

Tuttavia questo non è un comportamento normale di PHP. Un bugreport è già stato presentato come @Nile menzionato nei commenti sopra.


2

Come notato dalle altre risposte, è un problema con PHP che non è risolto ad oggi ma se si tratta di un "effetto collaterale" di var_dump()non ne sono così sicuro ..

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

Quello di cui sono sicuro è che se le proprietà di DateTimedove intendevamo essere usate da noi sarebbero state rese disponibili. Ma come molte classi interne sono non e non si deve fare affidamento su o metodi "hacky" "glitch" per riparare il vostro codice. Invece dovresti usare la loro API .

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

Se non sei soddisfatto puoi estendere la classe o magari usare Carbon che la estende per te.

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

Se scopri come var_dump()creare un falso output di un oggetto, dai un'occhiata__debugInfo()


2

La proprietà date di DateTime è protetta.

È possibile visualizzare la data con la funzione di formattazione.

<?php

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

Oppure puoi convertire in array:

<?php

try {
    $time = (array) new DateTime();
    var_dump($time["date"]);
} catch (Exception $e) {
}

Voleva sapere perché non poteva accedere alla proprietà date dell'oggetto DateTime ... Dove vedi che voleva formattare i valori Datetime memorizzati? "Ymd H: i: s" è il formato in cui la data è predefinita!
Filipe

La conversione da oggetto a matrice, come suggerisci, è probabilmente il modo più semplice per procedere.
Jeffz,

0

Se usi solo un var_Dump prima di chiedere la data della proprietà, tutto funziona correttamente:

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

Questo offre:

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

Quindi vedi che la data della proprietà esiste anche per l'oggetto. Non riesco a capire questo comportamento. Commenta semplicemente var_Dump e riceverai nuovamente l'errore.


error_reporting (0); echo date ("Ymd H: i: s", strtotime ($ mydate-> date));
Kaushik Das
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.