文章出處

PHP 的全局變量和 C 語言有一點點不同,在 C 語言中,全局變量在函數中自動生效,除非被局部變量覆蓋,這可能引起一些問題,有些人可能不小心就改變了一個全局變量。PHP 中全局變量在函數中使用時必須聲明為 global。
PHP: 變量范圍 - Manual

全局變量

在函數范圍之外所聲明的變量就是全局變量。由于函數可以視為單獨的程序片段,所以局部變量會覆蓋全局變量的能見度,因此在函數中并無法直接調用使用全局變量。

局部變量

在函數之中聲明的變量就是局部變量,并且該變量只有在函數范圍之中才能加以使用。如果其它程序局部需要調用使用該變量值時,必須透過return指令,來將其傳回至主程序區塊以作后續處理。

函數內使用全局變量

1、通過傳參方式將變量傳入函數內部使用函數內部不能改變全局變量的值
可以在傳參數時形參使用&符號與外部全局變量建立引用關系,這樣可以更改全局變量的值。

$a=10;
function canshu($x){
    echo $x;
}

canshu($a);//輸出10

2、通過global關鍵字聲明一個與全局變量同名的局部變量需先聲明后使用(實質上是建立了引用關系)此時在函數里面可以修改全局變量的值;unset后引用關系沒有了,但外部全局變量依舊存在。

$a=10;

function quanju(){
    global $a;
    echo $a;
    unset($a);//unset后引用關系沒有了,但外部全局變量依舊存在
    var_dump($a);//null
}

quanju();//輸出10
echo '<br/>out:';
echo $a;//輸出10

3、使用超全局數組GLOBALS
此時在函數里面可以修改全局變量的值;
unset后外部全局變量也不存在了。

$name='Bob';//全局變量$name也屬于超全局數組GLOBALS的成員之一
echo '<pre>';
// print_r($GLOBALS);
echo '</pre>';

echo $GLOBALS['name'];


function chao(){
    echo $GLOBALS['name'];
    $GLOBALS['name']='Allen';//將改變外部全局變量$name的值
    unset($GLOBALS['name']);//將unset外部全局變量$name的值
}
echo '<br/>in:';
chao();//Bob

echo '<br/>out:';
var_dump($name);//null

靜態變量(static)

PHP支持聲明函數變量為靜態的(static)。

一個靜態變量在所有對該函數的調用之間共享,并且僅在腳本的執行期間函數第一次被調用時被初始化。

要聲明函數變量為靜態的用關鍵字static。通常,靜態變量的第一次使用時賦予一個初始值。

函數內使用靜態變量關鍵字static聲明的變量在執行完函數后不會被釋放,下一次函數調用仍然生效。

function add(){
    static $a=0;
    echo $a;
    $a++;
}

add();//0
echo "<hr/>";
add();//1
echo "<hr/>";
add();//2

UPDATE
2016-1-9 16:54:19

Javascript語言函數內部可以直接讀取全局變量。

學習Javascript閉包(Closure) - 阮一峰的網絡日志
http://www.ruanyifeng.com/blog/2009/08/learning_javascript_closures.html


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 AutoPoster 的頭像
    AutoPoster

    互聯網 - 大數據

    AutoPoster 發表在 痞客邦 留言(0) 人氣()