首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Bug还是hack?$GLOBALS

Bug还是hack?$GLOBALS
EN

Stack Overflow用户
提问于 2011-05-21 17:39:19
回答 1查看 1.4K关注 0票数 17
代码语言:javascript
复制
$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)。第二行

代码语言:javascript
复制
int(1) int(2) int(3) int(4) int(5) int(6) NULL

没有第二行:

代码语言:javascript
复制
int(1) int(1) int(1) int(1) int(1) int(1) int(1)

为什么结果如此奇怪?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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),我们会得到:

代码语言:javascript
复制
 ["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']也成为了一个引用,因为两个条目必须指向同一个数组:

代码语言:javascript
复制
 ["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的问题。

票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6080905

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档