扣丁學堂帶你了解並讀懂PHP變數作用域

在現如今,隨著互聯網科技飛速的發展和進步, 目前在任何一種編程語言中,變數都有一定的生效範圍,比如大部分的 PHP變數只有一個單獨的範圍,最常見的是局部變數和全局變數,首先我先來介紹一下局部變數。

一般來說,局部變數都存在於一個具體的函數體內。在這個函數體內的變數,都可以在函數體內被使用,但是一旦到了函數外部,這個變數就不存在了。同理,在函數外的一個變數,在函數內也是無法使用的,請看這個例子:

$wow = 'hey!'; // 聲明一個全局變數

function sayHey()

{

echo $wow;

}

sayHey(); // 拋出 Notice 異常:未定義 $wow 變數

function sayHello()

Advertisements

{

$hello = 'Hey! Nice to meet you!';

}

echo $hello; // 同樣報錯:函數體內的變數不可以在外部訪問PHP

在上面兩個例子中,函數內無法引用函數外的局部變數,函數外也無法使用函數內聲明的變數。所以,當你想使用函數內的一個變數的值時,就需要使用 return 將它返回出函數體外。同理,函數之所以有參數,就是因為不能調用外部的變數,所以需要通過傳遞參數來將一個值傳遞到函數體內。

使用 include 或 require

在聲明了變數之後,再引入文件,那麼這個文件里的代碼也可以使用這個變數。道理很簡單,就像這樣:

$wow = 'hey!';

include 'wow.php';

Advertisements

// 假設以下是 wow.php 中的代碼

echo $wow; // 正常輸出 heyPHP

$wow 在整個作用域(也就是這個文件中)都會生效,所以他是一個全局變數。或者這麼說, 在函數體外聲明的變數,自改變數聲明開始,到程序文件末尾,都屬於有效的生效範圍。 這種特性對引入的文件也是一樣的。

GLOBAL

全局變數

必須掌握

在函數體外聲明的變數其實就可以看做是全局變數,但是由於函數的特性,他會默認在函數體內優先聲明新的變數。所以想要使用函數體外的變數,就必須使用 global 關鍵字。請看代碼:

$wow = 'Hey!';

$hello = 'Welcome to wowphp.com';

function sayHello()

{

// 聲明這兩個變數是引用全局變數

global $wow, $hello;

echo $wow. ' ' . $hello;

}

sayHello(); // 輸出 Hey! Welcome to wowphp.comPHP

注意到標註的第 7 行里的 global 關鍵字了嗎,它就可以讓函數在體內使用外部定義的全局變數。除此之外,PHP 還提供了一個內置數組 $GLOBALS,你也可以用這個數組來在函數體內調用外部變數:

$wow = 'Hey!';

$hello = 'Welcome to wowphp.com';

function sayHello()

{

echo $GLOBALS['wow'] . ' ' . $GLOBALS['hello'];

}

sayHello(); // 輸出 Hey! Welcome to wowphp.comPHP

$GLOBALS 是一個關聯數組,這個概念會在以後數組的一章中講到。在 $GLOBALS 中每一個變數為一個元素,鍵名對應變數名,值對應變數的內容。$GLOBALS 之所以在全局範圍內存在,是因為 $GLOBALS 是一個 超全局變數。同樣,有關超全局變數的介紹,也會在後面的章節中解釋。

STATIC

靜態變數

了解即可

在 PHP 中還有一種特性叫「靜態變數」,它僅僅存在於函數體中。但是在整個函數執行完后,這個值並不會消失,會一直保持更改之後的值。直到這個程序被銷毀。請看一個沒有使用靜態變數的示例:

function echoStatic()

{

$a = 0;

echo $a;

$a++;

}

echoStatic(); // 輸出 0

echoStatic(); // 輸出 0

echoStatic(); // 輸出 0PHP

你可以看到,我在函數體內讓 $a 遞增 1,並多次調用這個函數。但是得到的結果全部都是 0。因為每次調用時都會將 $a 的值設為 0 並輸出 0。將變數加一的 $a++ 沒有作用,因為一旦退出本函數則變數 $a 就不存在了。

那我就想讓他調用一次就加一呢?很簡單,將 $a 聲明為靜態變數即可:

function echoStatic()

{

static $a = 0;

echo $a;

$a++;

}

echoStatic(); // 輸出 0

echoStatic(); // 輸出 1

echoStatic(); // 輸出 2PHP

現在,變數 $a 僅在第一次調用 echoStatic() 函數時被初始化,之後每次調用 echoStatic() 函數都會輸出 $a 的值並加一。

注意:

聲明靜態變數時,必須是一個確定的值。如果是表達式就會報錯,因為靜態聲明是在 PHP 被編譯時解析的。

Advertisements

你可能會喜歡