abstract:<?php $arr = [1, 2, 4]; foreach ($arr as $val) { $sum +=&nb
<?php
$arr = [1, 2, 4];
foreach ($arr as $val) {
$sum += $val;
}
var_dump($val,$sum);
exit;
?>
輸出
int(4)
int(7)
為什么foreach 循環(huán)內(nèi)的$val和$sum變量已經(jīng)退出循環(huán)了,打印出來還是顯示變量存在?原因是:PHP有函數(shù)作用域,但是沒有塊級作用域,沒有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)
// 不管隱藏幾層循環(huán)還是一樣
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);
輸出結(jié)果:
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數(shù)組的最后一個元素變成引用$val了。雖然重新賦值為空數(shù)組,但后面的修改還是會影響到了$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);
?>
輸出結(jié)果:
array(3) {
[0]=>
int(2)
[1]=>
int(4)
[2]=>
int(8)
}
array(2) {
[0]=>
int(9)
[1]=>
int(10)
<?php
$arr = [1, 2, 4];
foreach ($arr as $val) {
$sum += $val;
}
var_dump($val,$sum);
exit;
?>
輸出
int(4)
int(7)
為什么foreach 循環(huán)內(nèi)的$val和$sum變量已經(jīng)退出循環(huán)了,打印出來還是顯示變量存在?原因是:PHP有函數(shù)作用域,但是沒有塊級作用域,沒有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)
// 不管隱藏幾層循環(huán)還是一樣
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);
輸出結(jié)果:
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數(shù)組的最后一個元素變成引用$val了。雖然重新賦值為空數(shù)組,但后面的修改還是會影響到了$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);
?>
輸出結(jié)果:
array(3) {
[0]=>
int(2)
[1]=>
int(4)
[2]=>
int(8)
}
array(2) {
[0]=>
int(9)
[1]=>
int(10)
Correcting teacher:天蓬老師Correction time:2019-04-10 09:53:29
Teacher's summary:任何時間, 都要明白, 作用域是針對變量的, 而函數(shù),類,常量等是不受作用域限制的