我有一种简单的方法来检测数组中的引用(用于调试目的)
首先,我使用array_values
克隆数组,然后更改克隆并查找原始更改。如果更改了该元素是参考。
简短的例子:
<?php
$a = [
'a' => 'b',
2 => 3,
];
$b = ['wow'];
$a['ref'] = &$b;
function getrefs($array) {
$marker = uniqid();
$copy = array_values($array);
$i = 0;
$return = [];
foreach ($array as $key => &$val) {
$stash = $val;
$copy[$i] = $marker;
if ($val === $marker) {
$val = $stash;
$return[] = $key;
}
$i++;
}
return $return;
}
var_dump($a);
var_dump(getrefs($a));
问题在于,当我尝试在$GLOBALS
上使用它时,它无效,我无法弄清楚原因。 $GLOBALS
中的所有内容都应该是所有权利的参考。
$GLOBALS
是如此奇怪以至于它是array_values
无法正确复制引用的唯一数组吗?
答案 0 :(得分:1)
你可能没有考虑递归。内置的PHP函数:
var_dump($GLOBALS);
将具有以下输出
array(7) {
["_GET"]=>
array(0) {
}
["_POST"]=>
array(0) {
}
["_COOKIE"]=>
array(1) {
["PHPSESSID"]=>
string(26) "od602et6qcfj6pa3pkjtl8go57"
}
["_FILES"]=>
array(0) {
}
["GLOBALS"]=>
*RECURSION*
["_SESSION"]=>
&array(0) {
}
}