我遇到了这句话:
list($diff, $current, $concurrent) = $diff;
Documentation声明这会导致未定义的行为。这种行为有哪些可能的变种?变量$ diff是数组,包含3个具有可变内容的元素。
此行是包含错误的应用程序的一部分,此行的作者不可用。虽然我几乎可以肯定它不是我想要的,但100%肯定会很高兴。 我使用PHP 5.6.25作为FPM / FastCGI。 提前谢谢。
答案 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);
这样可以避免未定义的行为。