foreach变量作用域

问题描述
今天排查一个bug的时候,发现了foreach的一个小坑

比如下面这段十分十分简单的代码:

<?php
    $a = [1, 2, 3];
    foreach ($a as $value) {
        echo $value;
    }

但是如果$value在之前被定义过,并且在循环之后你还想要继续使用的话,那么这里foreach的命名就会给你带来麻烦,比如下述代码:

<?php
    $value = 6; 
    $a = [1, 2, 3];
    foreach ($a as $value) {
        echo $value;
    } 
    $b = $value;
    echo $b; // output 3

上述代码在执行之后,$b的值可以看到是3,那是因为在foreach的时候,$value被重新赋值了

总结
在如果有使用到foreach,那么as后面的变量的命名最好不要和其他的变量发生重复,不然可能会引入一些意想不到的bug
原因是:PHP有函数作用域,但是没有块级作用域,没有C/C++、java等语言的块级作用域概念


参考:



登陆发表评论