11

所以我今天正在制作一个表格,碰巧给一个变量的名称与后来在 foreach 循环中使用的名称相同。令我惊讶的是,foreach 循环的声明覆盖了变量的先前声明。

对我来说,这似乎很奇怪,因为我希望将as $value => $a两个变量的范围限制在foreach循环中。

这就是发生的事情:

php > $a = 5;
php > $b = array(1,2,3);
php > foreach($b as $value => $a){ echo $a; };
123
php > echo $a;
3

这是我所期望的:

php > $a = 5; //define a in outer scope
php > $b = array(1,2,3);
php > foreach($b as $value => $a){ echo $a; /* This $a should be the one from the foreach declaration */ }; 
123
php > echo $a; //expecting inner scope to have gone away and left me to get the outer scoped $a

$a如果我用作循环的键,也会发生同样的事情foreach,更可怕的是这个宝石:

php > $a = 5;
php > $b = array(1,2,3);
php > foreach($b as $a => $b){ var_dump($b); }
int(1)
int(2)
int(3)
php > var_dump($b) // => int(3)

它覆盖了$b数组,但仍然循环遍历它的成员。

总而言之,这似乎有点古怪。我的问题是,我究竟在哪里可以找到指定这种行为是预期的文档/手册?

4

2 回答 2

10

PHP 中的作用域是全局或函数级别,没有块作用域,见http://php.net/manual/en/language.variables.scope.php

于 2013-11-14T17:53:39.293 回答
1

只有函数会创建新范围。由花括号形成的块范围不会形成新的。在您的示例中,您处于全局范围内。

于 2013-11-14T17:56:35.363 回答