list(), if 和短路评估

Posted

技术标签:

【中文标题】list(), if 和短路评估【英文标题】:list(), if and short-circuit evaluation 【发布时间】:2012-12-16 09:32:17 【问题描述】:

我有以下代码片段:

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

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

感谢解释

【问题讨论】:

这里没有错误codepad.org/33BV3EsO 【参考方案1】:

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

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

明确地,你的代码应该是这样的

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

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

【讨论】:

没问题,@F***Blechschmidt。 (和新年快乐;-))【参考方案2】:

了解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)) ) 

【讨论】:

以上是关于list(), if 和短路评估的主要内容,如果未能解决你的问题,请参考以下文章

C# 是不是使用 await 对 if 语句执行短路评估?

c中的内部短路评估

短路评估顺序和前缀增量运算符

线性搜索和短路评估(运行时错误)

短路评估和副作用[重复]

如何避免短路评估