我目前在Debian中使用PHP 7(PHP版本7.0.27-0 + deb9u1)并遇到以下问题:
list()
似乎剥夺了引用。但我知道过去的某一天它没有(可能在PHP 5.3或5.4附近)。
最小(非)工作示例:
$a=array('A');
$arr=array();
$arr[]=&$a;
var_dump($arr);
$arr[0]['X']='X';
list($entry)=$arr;
$entry['Z']='Z';
var_dump($arr);
预期输出:
/tmp/php_eval_ifEHDF:6:
array (size=1)
0 =>
array (size=1)
0 => string 'A' (length=1)
/tmp/php_eval_ifEHDF:13:
array (size=1)
0 =>
array (size=3)
0 => string 'A' (length=1)
'X' => string 'X' (length=1)
'Z' => string 'Z' (length=1)
实际输出:
/tmp/php_eval_rdQjSm:6:
array (size=1)
0 =>
array (size=1)
0 => string 'A' (length=1)
/tmp/php_eval_rdQjSm:12:
array (size=1)
0 =>
array (size=2)
0 => string 'A' (length=1)
'X' => string 'X' (length=1)
这是错误还是预期的行为?
现在我使用这样的东西来获得相同的结果(我希望像list()
这样的单行,但它对我来说看起来很难看:
//minimal version (parenthesis unneeded here)
$entry=&($arr)[0];
//really used version
$entry=&(some_function_returning_arr())[0];
但上述解决方法无法完成以下任务:
list($x, $y)=array(&a, &b);
//when changing $x, $a won't be changed as well :-(