1、簡介
PHP 中的變量用一個美圓符號後面跟變量名來表示。變量名是區分大小寫的。變量名與 PHP 中其它的標籤同樣遵循相同的規則。一個有效的變量名由字母或者下劃線開頭,後面跟上任意數量的字母,數字,或者下劃線。 php
注意:在此所說的字母是 a-z,A-Z,以及 ASCII 字符從 127 到 255(0x7f-0xff)。 $this 是一個特殊的變量,它不能被賦值。能夠看出變量名中也不能有.號。 html
前面幾課其實已經用到了變量,變量的賦值等內容。試試下面的代碼吧 數組
4 |
echo "$var, $Var"; // 輸出 "Bob, Joe" |
5 |
$3value = 'value'; // 非法變量名;以數字開頭運行時將報錯 |
6 |
$_3v = 'value'; // 合法變量名;如下劃線開頭 |
7 |
$i好的is = 'value'; // 合法變量名;能夠用中文 |
PHP 也提供了另一種方式給變量賦值:引用賦值。這意味着新的變量簡單的引用(相似於 「指向」)了原始變量。改動新的變量將影響到原始變量,反之亦然。 安全
使用引用賦值,簡單地將一個 & 符號加到將要賦值的變量前(源變量)。例如,下列代碼片段將輸出「My name is Bob」兩次: 服務器
2 |
$foo = 'Bob'; // 將 'Bob' 賦給 $foo |
3 |
$bar = &$foo; // 經過 $bar 引用 $foo |
4 |
$bar = "My name is $bar"; // 修改 $bar 變量 |
6 |
echo $foo; // $foo 的值也被修改 |
雖然在 PHP 中並不須要初始化變量,但對變量進行初始化是個好習慣。未初始化的變量具備其類型的默認值 – 布爾類型的變量默認值是 FALSE,整形和浮點型變量默認值是零,字符串型變量默認值是空字符串或者數組變量的默認值是空數組。 函數
依賴未初始化變量的默認值在某些狀況下會有問題,例如把一個文件包含到另外一個之中時碰上相同的變量名。另外把 register_globals(全局變量) 打開是一個主要的安全隱患。使用未初始化的變量會發出E_NOTICE錯誤,可是在向一個未初始化的數組附加單元時不會。isset() 語言結構能夠用來檢測一個變量是否已被初始化。 性能
2、預約義變量
預約義變量其實就是至關於一些可預見的變量,好比地址?後面的值可使用$_GET獲得,這個就是一個典型的預約義變量。 測試
一、$GLOBALS — 引用全局做用域中可用的所有變量。一個包含了所有變量的全局組合數組。變量的名字就是數組的鍵。(可是我以爲這個全局變量容易讓代碼難以理解,因此我我的不推薦你們這麼用)試試下面的代碼吧 ui
二、$_SERVER — 服務器和執行環境信息 ,$_SERVER 是一個包含了諸如頭信息(header)、路徑(path)、以及腳本位置(script locations)等等信息的數組。這個數組中的項目由 Web 服務器建立,可能根據不一樣的服務器給出的內容不同。在 $_SERVER 中,你也許可以,也許不可以找到下面的這些元素。注意,若是以命令行方式運行 PHP,下面列出的元素幾乎沒有有效的(或是沒有任何實際意義的)。 this
key |
簡介 |
PHP_SELF |
當前執行腳本的文件名,與 document root 有關。例如,在地址爲 http://example.com/test.php/foo.bar 的腳本中使用 $_SERVER['PHP_SELF'] 將獲得 /test.php/foo.bar。 |
argv |
傳遞給該腳本的參數的數組。當腳本以命令行方式運行時,argv 變量傳遞給程序 C 語言樣式的命令行參數。當經過 GET 方式調用時,該變量包含query string。 |
argc |
包含命令行模式下傳遞給該腳本的參數的數目(若是運行在命令行模式下)。 |
GATEWAY_INTERFACE |
服務器使用的 CGI 規範的版本;例如,「CGI/1.1」。 |
SERVER_ADDR |
當前運行腳本所在的服務器的 IP 地址。 |
SERVER_NAME |
當前運行腳本所在的服務器的主機名。若是腳本運行於虛擬主機中,該名稱是由那個虛擬主機所設置的值決定。 |
SERVER_SOFTWARE |
服務器標識字符串,在響應請求時的頭信息中給出。 |
SERVER_PROTOCOL |
請求頁面時通訊協議的名稱和版本。例如,「HTTP/1.0」。 |
REQUEST_METHOD |
訪問頁面使用的請求方法;例如,「GET」, 「HEAD」,「POST」,「PUT」。 |
REQUEST_TIME |
請求開始時的時間戳。從 PHP 5.1.0 起可用。 |
QUERY_STRING |
query string(查詢字符串),若是有的話,經過它進行頁面訪問。 |
DOCUMENT_ROOT |
當前運行腳本所在的文檔根目錄。在服務器配置文件中定義。 |
HTTP_ACCEPT |
當前請求頭中 Accept: 項的內容,若是存在的話。 |
HTTP_ACCEPT_CHARSET |
當前請求頭中 Accept-Charset: 項的內容,若是存在的話。例如:「iso-8859-1,*,utf-8」。 |
HTTP_ACCEPT_ENCODING |
當前請求頭中 Accept-Encoding: 項的內容,若是存在的話。例如:「gzip」。 |
HTTP_ACCEPT_LANGUAGE |
當前請求頭中 Accept-Language: 項的內容,若是存在的話。例如:「en」。 |
HTTP_CONNECTION |
當前請求頭中 Connection: 項的內容,若是存在的話。例如:「Keep-Alive」。 |
HTTP_HOST |
當前請求頭中 Host: 項的內容,若是存在的話。 |
HTTP_REFERER |
引導用戶代理到當前頁的前一頁的地址(若是存在)。由 user agent 設置決定。並非全部的用戶代理都會設置該項,有的還提供了修改 HTTP_REFERER 的功能。簡言之,該值並不可信。 |
HTTP_USER_AGENT |
當前請求頭中 User-Agent: 項的內容,若是存在的話。該字符串代表了訪問該頁面的用戶代理的信息。一個典型的例子是:Mozilla/4.5 [en] (X11; U; Linux 2.2.9 i586)。除此以外,你能夠經過get_browser() 來使用該值,從而定製頁面輸出以便適應用戶代理的性能。 |
HTTPS |
若是腳本是經過 HTTPS 協議被訪問,則被設爲一個非空的值。 |
REMOTE_ADDR |
瀏覽當前頁面的用戶的 IP 地址。 |
REMOTE_HOST |
瀏覽當前頁面的用戶的主機名。DNS 反向解析不依賴於用戶的 REMOTE_ADDR。 |
REMOTE_PORT |
用戶機器上鍊接到 Web 服務器所使用的端口號。 |
SCRIPT_FILENAME |
當前執行腳本的絕對路徑。若是在命令行界面(Command Line Interface, CLI)使用相對路徑執行腳本,例如 file.php 或 ../file.php,那麼 $_SERVER['SCRIPT_FILENAME'] 將包含用戶指定的相對路徑。 |
SERVER_ADMIN |
該值指明瞭 Apache 服務器配置文件中的 SERVER_ADMIN 參數。若是腳本運行在一個虛擬主機上,則該值是那個虛擬主機的值。 |
SERVER_PORT |
Web 服務器使用的端口。默認值爲 「80」。若是使用 SSL 安全鏈接,則這個值爲用戶設置的 HTTP 端口。 |
SERVER_SIGNATURE |
包含了服務器版本和虛擬主機名的字符串。 |
PATH_TRANSLATED |
當前腳本所在文件系統(非文檔根目錄)的基本路徑。這是在服務器進行虛擬到真實路徑的映像後的結果。 |
SCRIPT_NAME |
包含當前腳本的路徑。這在頁面須要指向本身時很是有用。__FILE__ 常量包含當前腳本(例如包含文件)的完整路徑和文件名。 |
REQUEST_URI |
URI 用來指定要訪問的頁面。例如 「/index.html」。 |
PHP_AUTH_DIGEST |
看成爲 Apache 模塊運行時,進行 HTTP Digest 認證的過程當中,此變量被設置成客戶端發送的「Authorization」 HTTP 頭內容(以便做進一步的認證操做)。 |
PHP_AUTH_USER |
當 PHP 運行在 Apache 或 IIS(PHP 5 是 ISAPI)模塊方式下,而且正在使用 HTTP 認證功能,這個變量即是用戶輸入的用戶名。 |
PHP_AUTH_PW |
當 PHP 運行在 Apache 或 IIS(PHP 5 是 ISAPI)模塊方式下,而且正在使用 HTTP 認證功能,這個變量即是用戶輸入的密碼。 |
AUTH_TYPE |
當 PHP 運行在 Apache 模塊方式下,而且正在使用 HTTP 認證功能,這個變量即是認證的類型。 |
PATH_INFO |
包含由客戶端提供的、跟在真實腳本名稱以後而且在查詢語句(query string)以前的路徑信息,若是存在的話。例如,若是當前腳本是經過 URLhttp://www.example.com/php/path_info.php/some/stuff?foo=bar 被訪問,那麼 $_SERVER['PATH_INFO'] 將包含 /some/stuff。 |
ORIG_PATH_INFO |
在被 PHP 處理以前,「PATH_INFO」 的原始版本。 |
三、$_GET 經過 URL 參數傳遞給當前腳本的變量的數組。即在命令行下失效。咱們在測試php那節講過$_GET['__DEBUG__'],用法很簡單。
四、$_POST 經過 HTTP POST 方法傳遞給當前腳本的變量的數組。和$_GET方法相似,只是傳遞方式不一樣。
五、$_FILES 經過 HTTP POST 方式上傳到當前腳本的項目的數組。
六、$_REQUEST 默認狀況下包含了 $_GET,$_POST和 $_COOKIE 的數組。以命令行方式運行時,將不包含 argv 和 argc 信息;它們將存在於 $_SERVER 數組。因爲 $_REQUEST 中的變量經過 GET,POST 和 COOKIE 輸入機制傳遞給腳本文件,所以能夠被遠程用戶篡改而並不可信。這個數組的項目及其順序依賴於 PHP 的 variables_order 指令的配置。
七、$_SESSION 當前腳本可用 SESSION 變量的數組。
八、$_ENV經過環境方式傳遞給當前腳本的變量的數組。
這些變量被從 PHP 解析器的運行環境導入到 PHP 的全局命名空間。不少是由支持 PHP 運行的 Shell 提供的,而且不一樣的系統極可能運行着不一樣種類的 Shell,因此不可能有一份肯定的列表。請查看你的 Shell 文檔來獲取定義的環境變量列表。
其餘環境變量包含了 CGI 變量,而無論 PHP 是以服務器模塊仍是 CGI 處理器的方式運行。
九、$_COOKIE經過 HTTP Cookies 方式傳遞給當前腳本的變量的數組。
十、$php_errormsg$php_errormsg 變量包含由 PHP 生成的最新錯誤信息。這個變量只在錯誤發生的做用域內可用,而且要求 track_errors配置項是開啓的(默認是關閉的)。
十一、$HTTP_RAW_POST_DATA $HTTP_RAW_POST_DATA 包含 POST 提交的原始數據。
十二、$http_response_header — HTTP 響應頭
1三、$argc — 傳遞給腳本的參數數目
1四、$argv — 傳遞給腳本的參數數組
3、變量範圍
變量的範圍即它定義的上下文背景(也就是它的生效範圍)。大部分的 PHP 變量只有一個單獨的範圍。這個單獨的範圍跨度一樣包含了 include 和 require 引入的文件。例如:
這個a在b.php一樣有效。任何用於函數內部的變量按缺省狀況將被限制在局部函數範圍內。可是可使用global來改變有效範圍。(和$GLOBALS相似,我也不推薦使用)例如:
06 |
global $a;//我聲明和外面的a是同樣的 |
變量範圍的另外一個重要特性是靜態變量。靜態變量僅在局部函數域中存在,但當程序執行離開此做用域時,其值並不丟失。看看下面的例子:
若是在聲明中用表達式的結果對其賦值會致使解析錯誤。
4、可變變量
其實可變變量就是變量名是個變量而已。請看代碼
這段代碼,一開始定義了一個變量$a,而後定義了一個變量$$a,其實能夠理解爲$hello;因此第三句和第四句都將打印出hello world;
注意:要將可變變量用於數組,必須解決一個模棱兩可的問題。這就是當寫下 $$a[1]時,解析器須要知道是想要 $a[1]做爲一個變量呢,仍是想要 $$a做爲一個變量並取出該變量中索引爲 [1] 的值。解決此問題的語法是,對第一種狀況用 ${$a[1]},對第二種狀況用 ${$a}[1]。
本文固定連接: http://www.qaforcode.net/archives/219 | 豬哥每日一貼