php不像java那样,有块级作用域,类中也没有代码块、或静态代码块的说法。
另外,没有块级作用域可能还会引发一些bug。
$arr = [1, 2, 4];
foreach ($arr as &$val) {
$val *= 2;
}
$val = [];//重新赋值
$val[0]=9;
$val[1]=10;
var_dump($arr);
以常理来看,$val 是 foreach 循环中的变量,它应该随着循环结束就消亡,但无论是 for 还是 if…else…都形成真正的作用域,也就是变量不会压栈(也意味着可以在for 或 if中定义变量)。
上面的结果输出:
array (size=3)
0 => int 2
1 => int 4
2 =>
array (size=2)
0 => int 9
1 => int 10
可以看到 $val 仍然引用了最后一个元素的值。后面又对该值进行了修改,导致数组错误。
如果希望消除上面的 bug,可在for循环结束后使用 unset($val)
$arr = [1, 2, 4];
foreach ($arr as &$val) {
$val *= 2;
}
unset($val); // 重要的 unset
$val = [];//重新赋值
$val[0]=9;
$val[1]=10;
var_dump($arr);
新的结果:
array (size=3)
0 => int 2
1 => int 4
2 => int 8
另外值得一提的是,虽然块级作用域不存在,但php仍可以使用 {}
{ // 代码块只有整理作用,并无作用域
$arr = [1, 2, 4];
}
foreach ($arr as &$val) {
$val *= 2;
}
var_dump($arr);
如果代码很多,可以用 {} 进行分组整理,以便看起来更舒服一些。
本篇完,还有疑问?留下评论吧