亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

請問有作用域嗎

Original 2019-04-09 21:34:52 286
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ù),類,常量等是不受作用域限制的

Release Notes

Popular Entries