# 變量
## 基本介紹
* PHP中的變量用一個美元符號(`$`)后面加變量名來表示,**變量名區分大小寫**。
* 一個有效的變量名由字母或者下劃線開始,后面跟上任意數量的字母、數字、下劃線以及 **中文漢字**。
* `$this` 是一個特殊的變量,它不能被賦值。
* 變量的賦值分為默認的 **傳值賦值** 和 **引用賦值**。
* 引用賦值,使用時需在即將賦值的變量名前面加上`&`(and符號),例如`$two = &$one;`,這樣新的`$two`變量的值如果發生改變,那么原始變量`$one`的值也會隨之改變,反過來也一樣。
* 變量可以使用引用賦值,但是沒有名字的表達式不可以,例如`$two = &(5+6)`。
## 作用范圍
* 變量有作用范圍,大部分變量只有一個單獨的范圍,這個范圍通常是指同處一個最近的上級大括號里,也就是同一個代碼塊里。
* 處于子代碼塊(如函數等)里的變量,我們叫他 **"局部變量"**,此外的變量可稱之為 **"全局變量"**。
* 在同一個代碼塊里時,使用 `include` 或 `require` 引入的變量可以被使用,下面兩種方式都是正確的。
~~~
<?php
// 引入A文件,里面就一行代碼:$a = 123;
include "a.php";
// 這里可以引用到變量$a
echo $a;
// 定義b變量
$b = 456;
// 引入B文件,里面就一行代碼:echo $b;
include "a.php";
?>
~~~
* 函數里的變量將有自己的作用范圍,我們叫它局部變量,如果在函數里面需要使用外面的全局變量,需要通過`global`關鍵字聲明變量,也可以使用PHP自定義的`$GLOBALS`數組來訪問。
* 如下面這個例子中,調用`test()`函數將不會輸出任何內容,而且會提示`$str`未定義的錯誤。
~~~
<?php
// 定義變量
$str = "abc";
// 定義函數
function test(){
// 輸出str變量
echo $str;
}
// 調用函數
test();
~~~
* 將上面的例子修改一下,通過`global`關鍵字可以正確的訪問到`$str`變量,結果將在瀏覽器上正確的輸出字符串`"abc"`。
~~~
<?php
// 定義變量
$str = "abc";
// 定義函數
function test(){
// 聲明變量
global $str;
// 輸出str變量
echo $str;
}
// 調用函數
test();
~~~
* 將上面的例子還可以修改一下,通過PHP系統自定義的`$GLOBALS`數組來訪問全局變量,結果也是正確的。
~~~
<?php
// 定義變量
$str = "abc";
// 定義函數
function test(){
// 輸出str變量
echo $GLOBALS["str"];
}
// 調用函數
test();
~~~
* `$GLOBALS` 是一個 **超全局變量**,在系統運行時,里面會自動存入很多的系統變量和我們自定義的全局變量。
## 靜態變量
* 通過`static`聲明的變量稱之為**靜態變量**,靜態變量在程序執行完成并且離開該作用范圍后還會一直存在。
~~~
<?php
function test(){
// 聲明靜態變量
static $count = 0;
// 靜態變量自增
$count++;
// 輸出靜態變量
echo $count;
}
// 第一次調用,輸出1
test();
// 第一次調用,輸出2
test();
~~~
* 靜態變量的賦值對象不允許是表達式。
* 靜態變量是編譯時解析的。
## 可變變量
* 可變變量指的是一個變量的名稱可以動態的設置和使用。
* 在變量的前面加上一個`$`美元符號,就可以使用可變變量,如下面的例子中,`$$a`對于系統來說會先拆分成`$`和`$a`,因為`$a`等于`key`,所以計算結果是`$key`。
~~~
// 定義A變量,值為key
$a = "key";
// 定義可變變量,值為value,相當于$key = "value"
$$a = "value";
// 輸出$$a,得到value;
echo $$a;
// 輸出$key,得到value;
echo $key;
~~~
* 系統解析可變變量的時候
* 在可變變量遇上數組的時候,需要解決一個讓系統糾結的問題,例如`$$key[1]`,系統在解析的時候會出現如下兩個情況:
* 情況一:`$` + `$key[1]`。
* 情況二:`$$key` + `[1]`。
* 對于上面兩種情況,系統默認選擇的是按情況一處理,假如我們想明確的控制,需要按下面這種方式使用:
* 情況一:`${$key[1]}`。
* 情況二:`${$key}[1]`。
* 官方的一個例子
~~~
<?php
$Bar = "a";
$Foo = "Bar";
$World = "Foo";
$Hello = "World";
$a = "Hello";
$a; // 得到 Hello
$$a; // 得到 World
$$$a; // 得到 Foo
$$$$a; // 得到 Bar
$$$$$a; // 得到 a
$$$$$$a; // 得到 Hello
$$$$$$$a; // 得到 World
~~~
> 注意,在 PHP 的函數和類的方法中,超全局變量不能用作可變變量。$this 變量也是一個特殊變量,不能被動態引用。
## 來自HTML頁面中form的變量
* 通過系統內置的`$_GET`或`$_POST`數組可以分別獲取來自于form表單GET或POST的內容,其中鍵對應input等標簽的name屬性值,值對應value的值。
* form表單中可以傳遞數組給PHP,只需給input等標簽的name值后面加上數組索引。
* form表單中標簽name值里如果包含了特殊字符(不符合PHP變量定義規則的字符),系統會自動將其轉換成下劃線。