PHP 中一個美元符號后面跟上一個變量名稱,即表示一個變量。變量的名稱是對大小寫敏感的。變量名與 PHP 中其它的標(biāo)簽一樣遵循相同的規(guī)則。一個有效的變量名由字母或者下劃線開頭,后面跟上任意數(shù)量的字母,數(shù)字,或者下劃線。按照正常的正則表達式,它將被表述 為:'[a-zA-Z_x7f-xff][a-zA-Z0-9_x7f-xff]*’
AD:
The global keyword
首先,一個使用 global 的例子:
使用 global
|
<?php $a = 1; $b = 2; function Sum() { global $a, $b; $b = $a + $b; } Sum(); echo $b; ?> |
以上腳本的輸出將是 “3”。在函數(shù)中申明了全局變量 $a 和 $b,任何變量的所有引用變量都會指向到全局變量。對于一個函數(shù)能夠申明的全局變量的最大個數(shù),PHP 沒有限制。
在全局范圍內(nèi)訪問變量的第二個辦法,是用特殊的 PHP 自定義 $GLOBALS 數(shù)組。前面的例子可以寫成:
使用 $GLOBALS 替代 global
<?php $a = 1; $b = 2; function Sum() { $GLOBALS["b"] = $GLOBALS["a"] + $GLOBALS["b"]; } Sum(); echo $b; ?> |
在 $GLOBALS 數(shù)組中,每一個變量為一個元素,鍵名對應(yīng)變量名,值變量的內(nèi)容。$GLOBALS 之所以在全局范圍內(nèi)存在,是因為 $GLOBALS 是一個超全局變量。以下范例顯示了超全局變量的用處:
演示超全局變量和作用域的例子
<?php function test_global() { // 大多數(shù)的預(yù)定義變量并不 "super",它們需要用 'global' 關(guān)鍵字來使它們在函數(shù)的本地區(qū)域中有效。 global $HTTP_POST_VARS; print $HTTP_POST_VARS['name']; // Superglobals 在任何范圍內(nèi)都有效,它們并不需要 'global' 聲明。Superglobals 是在 PHP 4.1.0 引入的。 print $_POST['name']; } ?> |
使用靜態(tài)變量
變量范圍的另一個重要特性是靜態(tài)變量(static variable)。靜態(tài)變量僅在局部函數(shù)域中存在,但當(dāng)程序執(zhí)行離開此作用域時,其值并不丟失??纯聪旅娴睦樱?/p>
演示需要靜態(tài)變量的例子
<?php function Test () { $a = 0; echo $a; $a++; } ?> |
本函數(shù)沒什么用處,因為每次調(diào)用時都會將 $a 的值設(shè)為 0 并輸出 “0”。將變量加一的 $a++ 沒有作用,因為一旦退出本函數(shù)則變量 $a 就不存在了。要寫一個不會丟失本次計數(shù)值的計數(shù)函數(shù),要將變量 $a 定義為靜態(tài)的:
使用靜態(tài)變量的例子
<?php function Test() { static $a = 0; echo $a; $a++; } ?> |
現(xiàn)在,每次調(diào)用 Test() 函數(shù)都會輸出 $a 的值并加一。
靜態(tài)變量也提供了一種處理遞歸函數(shù)的方法。遞歸函數(shù)是一種調(diào)用自己的函數(shù)。寫遞歸函數(shù)時要小心,因為可能會無窮遞歸下去。必須確保有充分的方法來中止遞歸。一下這個簡單的函數(shù)遞歸計數(shù)到 10,使用靜態(tài)變量 $count 來判斷何時停止:
靜態(tài)變量與遞歸函數(shù)
<?php function Test() { static $count = 0; $count++; echo $count; if ($count < 10) { Test (); } $count--; } ?> |
注: 靜態(tài)變量可以按照上面的例子聲明。如果在聲明中用表達式的結(jié)果對其賦值會導(dǎo)致解析錯誤。
聲明靜態(tài)變量
<?php function foo(){ static $int = 0; // correct static $int = 1+2; // wrong (as it is an expression) static $int = sqrt(121); // wrong (as it is an expression too) $int++; echo $int; } ?>