gpt4 book ai didi

php - 错误还是黑客? $全局

转载 作者:IT王子 更新时间:2023-10-29 00:12:57 27 4
gpt4 key购买 nike

$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)

为什么结果这么奇怪?

最佳答案

这里有一个可能的解释:

我们知道foreach总是loops over a copy of the array if it is not referenced :

Unless the array is referenced, foreach operates on a copy of the specified array and not the array itself. foreach has some side effects on the array pointer.

这意味着原始数组的内部指针没有改变,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

关于php - 错误还是黑客? $全局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6080905/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com