list(),if和短路评估

时间:2013-01-01 22:38:56

标签: php if-statement short-circuiting

我有以下代码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 个答案:

答案 0 :(得分:3)

这是operator precedence的问题,在您的情况下,&&会在=之前进行评估,从而导致您所描述的错误。

您可以通过将赋值语句放在括号内来解决此问题。

明确地,您的代码应该是

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

请注意,我已将其从if( $a=$b && $c )更改为if( ($a=$b) && $c )。括号强制赋值运算符(=)在连词(&&)之前进行评估,这就是你想要的。

答案 1 :(得分: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)) ) {