php list()未定义的行为

时间:2016-11-24 13:55:10

标签: php undefined-behavior

我遇到了这句话:

list($diff, $current, $concurrent) = $diff;

Documentation声明这会导致未定义的行为。这种行为有哪些可能的变种?变量$ diff是数组,包含3个具有可变内容的元素。

此行是包含错误的应用程序的一部分,此行的作者不可用。虽然我几乎可以肯定它不是我想要的,但100%肯定会很高兴。 我使用PHP 5.6.25作为FPM / FastCGI。 提前谢谢。

1 个答案:

答案 0 :(得分:1)

正如documentation for list()也指出:

  

在PHP 5中,list()分配从最右边的参数开始的值。在PHP 7中,list()以最左边的参数开始。

换句话说:这一行可能在PHP 5中按预期工作,因为双方出现的变量$diff是要分配的最后一个变量。但是,在PHP 7中,$diff变量首先被分配,因此在$diff$current的分配完成时$concurrent已经更改。

总的来说,我认为关于未定义行为的提示涉及这样一个事实,即如果变量出现在=符号的两侧,则不能依赖某些赋值来产生预期结果。该问题的解决方法可能如下所示:

list($temp, $current, $concurrent) = $diff;
$diff = $temp;
unset($temp);

这样可以避免未定义的行为。