2013-01-01 2 views
2

Я следующий код snipplet:список(), если и короткое замыкание оценка

$active_from = '31-12-2009'; 
if(list($day, $month, $year) = explode('-', $active_from) 
    && !checkdate($month, $day, $year)) { 
    echo 'test'; 
} 

Почему я получаю неопределенную переменную ошибку?

list($day, $month, $year) = explode('-', $active_from) возвращает true, поэтому оценивается list(), не так ли? Я думаю, переменные должны быть определены? Что я наблюдаю?

Это на мой взгляд, то же самое и не проливает ошибки:

$active_from = '31-12-2009'; 
list($day, $month, $year) = explode('-', $active_from); 
if(checkdate($month, $day, $year)) { 
    echo 'test'; 
} 

Это не вызывает ошибку:

if((list($day, $month, $year) = explode('-', $active_from)) && checkdate($month, $day, $year)) { 

Но я действительно не понимаю, почему :-)

Спасибо за разъяснение

+2

никаких ошибок здесь http://codepad.org/33BV3EsO –

ответ

3

Это вопрос operator precedence, в вашем случае, && оценивает до =, что приводит к ошибкам вы описываете.

Вы можете решить эту проблему, поставив оператор присваивания в круглые скобки.

Явное, код должен прочитать

if( (list($day, $month, $year) = explode('-', $active_from)) 
    && !checkdate($month, $day, $year)) { 

Обратите внимание, что я изменил его от if($a=$b && $c) до if(($a=$b) && $c). Скобки заставляют оператор присваивания (=) оценивать перед конъюнкцией (&&), что и есть то, что вы хотите.

+0

спасибо большое :) –

+0

Без проблем, @FabianBlechschmidt. (И с Новым годом ;-)) – Richard

1

Подробнее о operator precedence.

if (list($day, $month, $year) = explode('-', $active_from) && !checkdate($month, $day, $year)) { 

идентичен

if (list($day, $month, $year) = (explode('-', $active_from) && !checkdate($month, $day, $year))) { 
+0

спасибо большое :) –

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