php list() 未定义行为

php list() undefined behaviour

我遇到了这条线:

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

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

此行是包含错误的应用程序的一部分,此行的作者不可用。虽然我几乎可以肯定这不是我要找的东西,但能 100% 确定就更好了。 我正在使用 PHP 5.6.25 作为 FPM/FastCGI。 提前致谢。

正如 documentation for list() 还指出的那样:

In PHP 5, list() assigns the values starting with the right-most parameter. In PHP 7, list() starts with the left-most parameter.

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

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

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

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