2

我有以下代码片段:

$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)return 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)) {

但我真的不明白为什么:-)

感谢您的解释

4

2 回答 2

3

这是运算符优先级的问题,在您的情况下,&&评估在 之前=,导致您描述的错误。

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

明确地,您的代码应该阅读

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

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

于 2013-01-01T22:44:20.080 回答
1

阅读运算符优先级

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

等同于

if ( list($day, $month, $year) = (explode('-', $active_from) && !checkdate($month, $day, $year)) ) {
于 2013-01-01T22:44:18.340 回答