abstract:<?php $arr = [1, 2, 4]; foreach ($arr as $val) { $sum += $val; } var_dump($val,$sum); exit; ?> 输出 int(4) int(7) 为
<?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)
块级作用域不清楚是什么意思,这题无法说明什么原因;
百度搜索说是unset注销,但也不清楚是什么意思.
Correcting teacher:查无此人Correction time:2019-03-27 08:59:32
Teacher's summary:完成的不错。 变量知道吗?变量创建好后,每次打印变量都有值, 如果用unset(变量),就会把这个变量销毁, 在打印变量,就发现报错,没有这个值。
块级的建议,在问下教课老师,这个说起来就复杂一些。