$GLOBALS["items"] = array('one', 'two', 'three', 'four', 'five' ,'six', 'seven');
$alter = &$GLOBALS["items"]; // Comment this line
foreach($GLOBALS["items"] as $item) {
echo get_item_id();
}
function get_item_id(){
var_dump(key($GLOBALS["items"]));
}
检查此代码的输出,其中包含注释和未注释的第二行。我的结果(PHP 5.3.0)。第二行
int(1) int(2) int(3) int(4) int(5) int(6) NULL
没有第二行:
int(1) int(1) int(1) int(1) int(1) int(1) int(1)
为什么结果如此奇怪?
发布于 2011-05-21 18:10:11
以下是一个可能的解释:
我们知道foreach
总是loops over a copy of the array if it is not referenced
除非数组为referenced,否则
foreach
将对指定数组的副本而不是数组本身进行操作。foreach
对数组指针有一些副作用。
这意味着原始数组的内部指针是而不是 changed,key()
将始终返回相同的值(正如我们注释掉该行时所看到的那样)。实际上,如果我们做一个var_dump($GLOBALS)
,我们会得到:
["items"]=>
array(7) {
[0]=>
string(3) "one"
[1]=>
string(3) "two"
[2]=>
string(5) "three"
[3]=>
string(4) "four"
[4]=>
string(4) "five"
[5]=>
string(3) "six"
[6]=>
string(5) "seven"
}
(无参考资料)
但是,一旦我们生成了对数组的引用(使用$alter
),$GLOBALS['items']
也成为了一个引用,因为两个条目必须指向同一个数组:
["items"]=>
&array(7) {
[0]=>
string(3) "one"
[1]=>
string(3) "two"
[2]=>
string(5) "three"
[3]=>
string(4) "four"
[4]=>
string(4) "five"
[5]=>
string(3) "six"
[6]=>
string(5) "seven"
}
["alter"]=>
&array(7) {
[0]=>
string(3) "one"
[1]=>
string(3) "two"
[2]=>
string(5) "three"
[3]=>
string(4) "four"
[4]=>
string(4) "five"
[5]=>
string(3) "six"
[6]=>
string(5) "seven"
}
因此,foreach
循环确实会遍历原始数组并更改内部指针,这会影响key()
。
总而言之:这是引用的问题,而不是$GLOBALS
的问题。
https://stackoverflow.com/questions/6080905
复制相似问题