變數的範圍即它定義的上下文背景(也就是它的生效範圍)。大部分的 php 變數只有乙個單獨的範圍。這個單獨的範圍跨度同樣包含了 include 和 require 引入的檔案。例如:
<?php
$a = 1;
include
'b.inc'
;?>
這裡變數 $a
將會在包含檔案 b.inc 中生效。但是,在使用者自定義函式中,乙個區域性函式範圍將被引入。任何用於函式內部的變數按預設情況將被限制在區域性函式範圍內。例如:
<?php
$a = 1;
/* 全域性變數 */
function
test
()test
();?>
這個指令碼不會有任何輸出,因為 echo 語句引用了乙個區域性版本的變數 $a
,而且在這個範圍內,它並沒有被賦值。你可能注意到 php 的全域性變數和 c 語言有一點點不同,在 c 語言中,全域性變數在函式中自動生效,除非被區域性變數覆蓋。這可能引起一些問題,有些人可能不小心就改變了乙個全域性變數。php 中全域性變數在函式中使用時必須宣告為 global。
首先,乙個使用 global 的例子:
example #1 使用 global
<?php
$a = 1;
$b = 2;
function
sum()
sum();
echo $b;
?>
以上指令碼的輸出將是「3」。在函式中宣告了全域性變數 $a
和 $b
之後,對任一變數的所有引用都會指向其全域性版本。對於乙個函式能夠宣告的全域性變數的最大個數,php 沒有限制。
在全域性範圍內訪問變數的第二個辦法,是用特殊的 php 自定義 $globals
陣列。前面的例子可以寫成:
example #2 使用 $globals
替代 global
<?php
$a = 1;
$b = 2;
function
sum()
sum();
echo $b;
?>
$globals
是乙個關聯陣列,每乙個變數為乙個元素,鍵名對應變數名,值對應變數的內容。$globals
之所以在全域性範圍內存在,是因為 $globals 是乙個超全域性變數。以下範例顯示了超全域性變數的用處:
example #3 演示超全域性變數和作用域的例子
<?php
function
test_global
()?>
變數範圍的另乙個重要特性是靜態變數(static variable)。靜態變數僅在區域性函式域中存在,但當程式執行離開此作用域時,其值並不丟失。看看下面的例子:
example #4 演示需要靜態變數的例子
<?php
function
test
()?>
本函式沒什麼用處,因為每次呼叫時都會將 $a
的值設為 0 並輸出 0。將變數加一的 $a
++ 沒有作用,因為一旦退出本函式則變數 $a
就不存在了。要寫乙個不會丟失本次計數值的計數函式,要將變數 $a
定義為靜態的:
example #5 使用靜態變數的例子
<?php
function
test
()?>
現在,變數 $a
僅在第一次呼叫 test() 函式時被初始化,之後每次呼叫 test() 函式都會輸出 $a
的值並加一。
靜態變數也提供了一種處理遞迴函式的方法。遞迴函式是一種呼叫自己的函式。寫遞迴函式時要小心,因為可能會無窮遞迴下去。必須確保有充分的方法來中止遞迴。以下這個簡單的函式遞迴計數到 10,使用靜態變數 $count
來判斷何時停止:
example #6 靜態變數與遞迴函式
<?php
function
test
()$count
--;}
?>
note:靜態宣告是在編譯時解析的。靜態變數可以按照上面的例子宣告。如果在宣告中用表示式的結果對其賦值會導致解析錯誤。
example #7 宣告靜態變數
<?php
function
foo()
?>
note:在函式之外使用 global 關鍵字不算錯。可以用於在乙個函式之內包含檔案時。
在 zend 引擎 1 代,它驅動了 php4,對於變數的 static 和 global 定義是以引用的方式實現的。例如,在乙個函式域內部用 global 語句匯入的乙個真正的全域性變數實際上是建立了乙個到全域性變數的引用。這有可能導致預料之外的行為,如以下例子所演示的:
<?php
function
test_global_ref
() function
test_global_noref
() test_global_ref
();var_dump
($obj
);test_global_noref
();var_dump
($obj
);?>
以上例程會輸出:
null
object(stdclass)(0)
類似的行為也適用於 static 語句。引用並不是靜態地儲存的:
<?php
function &
get_instance_ref
() $obj
->
property
++;return
$obj;}
function &
get_instance_noref
() $obj
->
property
++;return
$obj;}
$obj1
= get_instance_ref
();$still_obj1
= get_instance_ref
();echo
"\n"
;$obj2
= get_instance_noref
();$still_obj2
= get_instance_noref
();?>
以上例程會輸出:
static object: null
static object: null
static object: null
static object: object(stdclass)(1)
上例演示了當把乙個引用賦值給乙個靜態變數時,第二次呼叫 &get_instance_ref() 函式時其值並沒有被記住。
php全域性變數範圍
a 1 include b.inc 這裡變數 a 將會在包含檔案 b.inc 中生效。但是,在使用者自定義函式中,乙個區域性函式範圍將被引入。任何用於函式內部的變數按預設情況將被限制在區域性函式範圍內。a 1 global scope function test test 這個指令碼不會有任何輸出,...
php 全域性變數範圍分析
複製 如下 php a 1 in程式設計客棧clude b.inc 這裡變數 aqbghlslqku 將會在包含檔案 b.inc 中生效。但是,在使用者自定義函式中,乙個區域性函式範圍將被引入。任何用於函式內部的變數按預設情況將被限制在區域性函式範圍內。複製 如下 a 1 global scope ...
PHP變數的作用範圍例項講解
案例 phpfunction test test echo echo a 案例結果 案例 function test test echo echo a vjpcloytep 案例結果 案例 宣告方式 global l程式設計客棧t php a 10 function test test 案例結果 案...