当前位置: 首页 > 未分类>阅读正文

php没有块级作用域

2022.7.12 朱丰华 53 次 留下评论 687字

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

如果代码很多,可以用 {} 进行分组整理,以便看起来更舒服一些。

本篇完,还有疑问?留下评论吧

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注