php變量

1、簡介

PHP 中的變量用一個美圓符號後面跟變量名來表示。變量名是區分大小寫的。變量名與 PHP 中其它的標籤同樣遵循相同的規則。一個有效的變量名由字母或者下劃線開頭,後面跟上任意數量的字母,數字,或者下劃線。 php

注意:在此所說的字母是 a-z,A-Z,以及 ASCII 字符從 127 到 255(0x7f-0xff)。  $this 是一個特殊的變量,它不能被賦值。能夠看出變量名中也不能有.號。 html

前面幾課其實已經用到了變量,變量的賦值等內容。試試下面的代碼吧 數組

1 <?php
2 $var = 'Bob';
3 $Var = 'Joe';
4 echo "$var, $Var";      // 輸出 "Bob, Joe"
5 $3value = 'value';     // 非法變量名;以數字開頭運行時將報錯
6 $_3v = 'value';    // 合法變量名;如下劃線開頭
7 $i好的is = 'value';  // 合法變量名;能夠用中文
8  
9 ?>

PHP 也提供了另一種方式給變量賦值:引用賦值。這意味着新的變量簡單的引用(相似於 「指向」)了原始變量。改動新的變量將影響到原始變量,反之亦然。 安全

使用引用賦值,簡單地將一個 & 符號加到將要賦值的變量前(源變量)。例如,下列代碼片段將輸出「My name is Bob」兩次: 服務器

1 <?php
2 $foo = 'Bob';              // 將 'Bob' 賦給 $foo
3 $bar = &$foo;              // 經過 $bar 引用 $foo
4 $bar = "My name is $bar";  // 修改 $bar 變量
5 echo $bar;
6 echo $foo;                 // $foo 的值也被修改
7 ?>

雖然在 PHP 中並不須要初始化變量,但對變量進行初始化是個好習慣。未初始化的變量具備其類型的默認值 – 布爾類型的變量默認值是 FALSE,整形和浮點型變量默認值是零,字符串型變量默認值是空字符串或者數組變量的默認值是空數組。 函數

依賴未初始化變量的默認值在某些狀況下會有問題,例如把一個文件包含到另外一個之中時碰上相同的變量名。另外把 register_globals(全局變量) 打開是一個主要的安全隱患。使用未初始化的變量會發出E_NOTICE錯誤,可是在向一個未初始化的數組附加單元時不會。isset() 語言結構能夠用來檢測一個變量是否已被初始化。 性能

2、預約義變量

預約義變量其實就是至關於一些可預見的變量,好比地址?後面的值可使用$_GET獲得,這個就是一個典型的預約義變量。 測試

一、$GLOBALS — 引用全局做用域中可用的所有變量。一個包含了所有變量的全局組合數組。變量的名字就是數組的鍵。(可是我以爲這個全局變量容易讓代碼難以理解,因此我我的不推薦你們這麼用)試試下面的代碼吧 ui

1 function test(){
2   $l="我在函數裏面\n";
3   echo $l;
4   echo $GLOBALS['l'];
5  
6 }
7 $l = "我在函數外面";
8 echo $l."\n";
9 test();

二、$_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 引入的文件。例如:

1 <?php
2 $a = "我是a";
3 include("b.php");
4 ?>

這個a在b.php一樣有效。任何用於函數內部的變量按缺省狀況將被限制在局部函數範圍內。可是可使用global來改變有效範圍。(和$GLOBALS相似,我也不推薦使用)例如:

01 <?php
02 $a = '我在外部';
03 function test(){
04 $a='我在內部,我和外面的a無關';
05 echo $a."\n";
06 global $a;//我聲明和外面的a是同樣的
07 echo $a."\n";
08 }
09 echo $a;
10 test();
11 ?>

變量範圍的另外一個重要特性是靜態變量靜態變量僅在局部函數域中存在,但當程序執行離開此做用域時,其值並不丟失。看看下面的例子:

1 function test()
2 {
3     static $a = 0;
4     echo $a."\n";
5     $a++;
6 }
7 test();test();

若是在聲明中用表達式的結果對其賦值會致使解析錯誤。

4、可變變量

 

其實可變變量就是變量名是個變量而已。請看代碼

1 <?php
2 $a = 'hello';
3 $$a = "world";
4 echo "$a ${$a}";
5 echo "$a $hello";
6 ?>

這段代碼,一開始定義了一個變量$a,而後定義了一個變量$$a,其實能夠理解爲$hello;因此第三句和第四句都將打印出hello world;

注意:要將可變變量用於數組,必須解決一個模棱兩可的問題。這就是當寫下 $$a[1]時,解析器須要知道是想要 $a[1]做爲一個變量呢,仍是想要 $$a做爲一個變量並取出該變量中索引爲 [1] 的值。解決此問題的語法是,對第一種狀況用 ${$a[1]},對第二種狀況用 ${$a}[1]。

 

本文固定連接: http://www.qaforcode.net/archives/219 | 豬哥每日一貼

相關文章
相關標籤/搜索