2015-05-06 4 views
7

При выполнении некоторых тестов и заметил, что проверка общедоступных свойств объектов DateInterval возвращает false, даже если они содержат данные. Почему это/чего нам не хватает в документации?Свойства DateInterval и isset()

Пример:

$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); 

Даст следующий вывод:

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

сделать 'var_dump ($ interval)' перед тем, как сделать остальные. Я не вижу, как '-> m' может просто« исчезнуть ». если бы он не был установлен, то не было бы у него когда-либо «2» в предыдущем дампе, тем более, что вы никоим образом не изменяете объект интервала. –

+0

Я добавил запрос var_dump в исходный вопрос для форматирования (php 5.6) – RumpRanger

+0

Удалось найти эту ошибку после много путаницы сегодня .. сумасшедшие вещи – mickadoo

ответ

0

Это, безусловно, интересно. Проверьте это:

$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)); 

Выполнение var_dump($interval) перед вызовом isset() печатает правильные результаты!

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) 

Я думаю, вы, должно быть, действительно наткнулись на один из этих причуд на языке. Нет ничего, о чем я могу думать, связанного с var_dump или isset, или реализации ООП в PHP, если это имеет значение, что может привести к такому поведению. Возможно, сообщение об ошибке для PHP?

+0

, если вы напечатаете объект, он, кажется, заставляет значения. Кажется довольно изворотливым для меня. – RumpRanger

+0

yup - его почти как печать объекта каким-то образом «материализует» свойства, которые он имеет. По крайней мере, что касается isset, потому что мы уже знаем, что свойства имеют значения, поскольку их печать напрямую работает просто отлично. – raidenace

+0

Я собираюсь подать отчет об ошибке, я был уверен, что мы что-то делаем неправильно. – RumpRanger

Смежные вопросы