變量范圍即它定義的上下文背景(也就是它的生效范圍)。在javascript中,並沒有變量范圍這一概念,相似的可能是作用域。但是,由於javscript使用的是詞法作用域,指變量聲明時的位置;而php並不存在變量聲明,變量在第一次賦值時相當於聲明了變量。所以,二者並不相同。本文將詳細介紹php中的變量范圍
大部分的PHP變量只有一個單獨的范圍。這個單獨的范圍跨度同樣包含了include和require引入的文件
這裡變量$a將會在包含文件b.inc中生效
<?php $a = 1; include 'b.inc'; ?>
在用戶自定義函數中,一個局部函數范圍將被引入。任何用於函數內部的變量按缺省情況將被限制在局部函數范圍內
下面這個腳本不會有任何輸出,因為echo語句引用了一個局部版本的變量 $a,而且在這個范圍內,它並沒有被賦值
<?php $a = 1; /* global scope */ function Test() { echo $a; /* reference to local scope variable */ } Test(); ?>
以下腳本的輸出將是“3”。在函數中聲明了全局變量$a和$b之後,對任一變量的所有引用都會指向其全局版本。對於一個函數能夠聲明的全局變量的最大個數,PHP沒有限制
<?php $a = 1; $b = 2; function Sum() { global $a, $b; $b = $a + $b; } Sum(); echo $b; ?>
在全局范圍內訪問變量的第二個辦法,是用特殊的PHP自定義$GLOBALS數組
GLOBALS是一個關聯數組,每一個變量為一個元素,鍵名對應變量名,值對應變量的內容。GLOBALS之所以在全局范圍內存在,是因為GLOBALS是一個超全局變量
<?php $a = 1; $b = 2; function Sum() { $GLOBALS['b'] = $GLOBALS['a'] + $GLOBALS['b']; } Sum(); echo $b; ?>
對於全部腳本而言,PHP提供了大量的預定義變量。這些變量將所有的外部變量表示成內建環境變量,並且將錯誤信息表示成返回頭
下面是預定義變量的列表
超全局變量 — 超全局變量是在全部作用域中始終可用的內置變量 $GLOBALS — 引用全局作用域中可用的全部變量 $_SERVER — 服務器和執行環境信息 $_GET — HTTP GET 變量 $_POST — HTTP POST 變量 $_FILES — HTTP 文件上傳變量 $_REQUEST — HTTP Request 變量 $_SESSION — Session 變量 $_ENV — 環境變量 $_COOKIE — HTTP Cookies $php_errormsg — 前一個錯誤信息 $HTTP_RAW_POST_DATA — 原生POST數據 $http_response_header — HTTP 響應頭 $argc — 傳遞給腳本的參數數目 $argv — 傳遞給腳本的參數數組
大多數的預定義變量並不是超全局變量,它們需要用'global' 關鍵字來使它們在函數的本地區域中有效
超全局變量在任何范圍內都有效,它們並不需要'global'聲明
下面是超全局變量的列表
$GLOBALS $_SERVER $_GET $_POST $_FILES $_COOKIE $_SESSION $_REQUEST $_ENV
<?php function test_global() { //預定義變量 global $HTTP_POST_VARS; echo $HTTP_POST_VARS['name']; //超全局變量 echo $_POST['name']; } ?>