PHP没有块作用域会引发的问题

Original 2019-03-13 23:52:34 283
abstract:百度的答案,感觉这个问题好难,不太理解。老师可以解答一下吗?<?php    $arr = [1, 2, 4]; foreach ($arr as $val) { $sum += $val; } var_dump($val,$sum); exit;?>输出int(4)int(7)为什么foreach 循环内的$val和$sum变量已经退出循环了,打印出来还是显示变

百度的答案,感觉这个问题好难,不太理解。老师可以解答一下吗?



<?php

    $arr = [1, 2, 4];

foreach ($arr as $val) {

$sum += $val;

}

var_dump($val,$sum);

exit;

?>

输出


int(4)

int(7)

为什么foreach 循环内的$val和$sum变量已经退出循环了,打印出来还是显示变量存在?原因是:PHP有函数作用域,但是没有块级作用域,没有C/C++、java等语言的块级作用域概念,比如C++里面:


//c++

    for(int i=0;i<10;i++){

        cout<<i<<endl;

    }

    i=11;//编译错误

因此,对于PHP以下几种情况变量都是存在的:


<?php

for($i=0;$i<10;$i++){

;

}

var_dump($i);//输出int(10)

 

 

// 不管隐藏几层循环还是一样

for ($i = 0; $i < 10; $i++) {

for ($j = 0; $j < 10; $j++) {

$k = 777;

}

}

var_dump($j);//输出10

var_dump($k);//输出777

建议:每次使用变量前都初始化:


for ($i = 0; $i < 10; $i++) {

for ($j = 0; $j < 10; $j++) {

$k = 777;

}

}

 

$k = 0;//初始值,重新使用

 

...

那是不是初始化就万无一失了呢?看下面这个例子


$arr = [1, 2, 4];

foreach ($arr as &$val) {

$val  *= 2;

}

 

$val = [];//重新赋值

$val[0]=9;

$val[1]=10;

var_dump($arr,$val);

输出结果:


array(3) {

  [0]=>

  int(2)

  [1]=>

  int(4)

  [2]=>

  &array(2) {

    [0]=>

    int(9)

    [1]=>

    int(10)

  }

}

array(2) {

  [0]=>

  int(9)

  [1]=>

  int(10)

}

可以看到$arr数组的最后一个元素变成引用$val了。虽然重新赋值为空数组,但后面的修改还是会影响到了$arr。原因是$val是一个引用,后面的修改都会影响到,除非加unset($val);


<?php

$arr = [1, 2, 4];

foreach ($arr as &$val) {

$val *= 2;

}

unset($val);

$val = [];

$val[0] = 9;

$val[1] = 10;

var_dump($arr, $val);

?>

输出结果:


array(3) {

  [0]=>

  int(2)

  [1]=>

  int(4)

  [2]=>

  int(8)

}

array(2) {

  [0]=>

  int(9)

  [1]=>

  int(10)

}

Correcting teacher:查无此人Correction time:2019-03-14 09:13:48
Teacher's summary:有问题可以在工单上提。。php里的function创建的变量,才会在function执行完后销毁。 你的$val和$sum没有做销毁动作。循环后,保留最后一次循环的数据。 如果照你这么说,循环里的函数不存在,那如果我想得到,这次循环的次数,或者循环时,有不一样的值,怎么保存区分出来呢? 循环是为了得到循环时的数据,在循环结束后,变量自动销毁,那你拿到什么数据了?没有数据,不就白循环了?

Release Notes

Popular Entries