2015-05-06 13 views
7

Durante l'esecuzione di alcuni test e notato che il controllo delle proprietà pubbliche sugli oggetti DateInterval restituisce false anche se contengono dati. Perché questo/cosa ci manca dalla documentazione?DateInterval properties e isset()

Esempio:

$currentDate = new DateTime(); 
$targetDate = new DateTime('2015-03-05 11:11:11'); 
$interval = $currentDate->diff($targetDate); 
var_dump($interval->y); 
var_dump($interval->m); 
var_dump(isset($interval->y)); 
var_dump(isset($interval->m)); 
var_dump($interval); 

darà il seguente output:

int(0) 
int(2) 
bool(false) 
bool(false) 
object(DateInterval)#3 (15) { 
    ["y"]=> 
    int(0) 
    ["m"]=> 
    int(2) 
    ["d"]=> 
    int(1) 
    ["h"]=> 
    int(9) 
    ["i"]=> 
    int(43) 
    ["s"]=> 
    int(35) 
    ["weekday"]=> 
    int(0) 
    ["weekday_behavior"]=> 
    int(0) 
    ["first_last_day_of"]=> 
    int(0) 
    ["invert"]=> 
    int(1) 
    ["days"]=> 
    int(62) 
    ["special_type"]=> 
    int(0) 
    ["special_amount"]=> 
    int(0) 
    ["have_weekday_relative"]=> 
    int(0) 
    ["have_special_relative"]=> 
    int(0) 
} 
+0

fare un 'var_dump ($ interval)' prima di fare gli altri. Non riesco a vedere come '-> m' potrebbe semplicemente" svanire "in quel modo. se non fosse stato impostato, allora non ci sarebbe stato modo di avere "2" in esso per il precedente dump, specialmente visto che non stai modificando l'oggetto intervallo in alcun modo. –

+0

Ho aggiunto l'output var_dump richiesto alla domanda iniziale per la formattazione (php 5.6) – RumpRanger

+0

Gestito per trovare questo errore dopo un sacco di confusione oggi .. roba pazzesca – mickadoo

risposta

0

Questo è sicuramente interessante. Check this out:

$currentDate = new DateTime(); 
$targetDate = new DateTime('2015-03-05 11:11:11'); 
$interval = $currentDate->diff($targetDate); 
echo "<pre>"; 
//var_dump($interval); --> if you uncomment this line, it will work just fine 
var_dump($interval->y); 
var_dump($interval->m); 
var_dump(isset($interval->y)); 
var_dump(isset($interval->m)); 

Facendo un var_dump($interval) prima di chiamare isset() stampe i risultati corretti!

object(DateInterval)#3 (15) { 
    ["y"]=> 
    int(0) 
    ["m"]=> 
    int(2) 
    ["d"]=> 
    int(1) 
    ["h"]=> 
    int(9) 
    ["i"]=> 
    int(49) 
    ["s"]=> 
    int(33) 
    ["weekday"]=> 
    int(0) 
    ["weekday_behavior"]=> 
    int(0) 
    ["first_last_day_of"]=> 
    int(0) 
    ["invert"]=> 
    int(1) 
    ["days"]=> 
    int(62) 
    ["special_type"]=> 
    int(0) 
    ["special_amount"]=> 
    int(0) 
    ["have_weekday_relative"]=> 
    int(0) 
    ["have_special_relative"]=> 
    int(0) 
} 
int(0) 
int(2) 
bool(true) 
bool(true) 

Penso che tu debba essere davvero incappato in uno di quei capricci nella lingua. Non c'è nulla che possa pensare relativo a var_dump o isset o all'implementazione OOP di PHP per quella materia, che può causare questo comportamento. Forse un bug segnala a PHP?

+0

se si stampa l'oggetto sembra forzare i valori. Sembra piuttosto bizzarro per me. – RumpRanger

+0

sì - è quasi come stampare l'oggetto in qualche modo "materializza" le proprietà che ha. Almeno per quanto riguarda isset, perché sappiamo già che le proprietà hanno dei valori poiché la loro stampa ha funzionato direttamente bene. – raidenace

+0

Ho intenzione di presentare un bug report, ero abbastanza sicuro che ci fosse qualcosa che stavamo facendo in modo errato. – RumpRanger