PHP:检测$ GLOBALS中的引用

时间:2017-03-29 17:47:27

标签: php

我有一种简单的方法来检测数组中的引用(用于调试目的)

首先,我使用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无法正确复制引用的唯一数组吗?

1 个答案:

答案 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) {
   }
}