PHP變數的值型別和引用型別
PHP 變數在記憶體中儲存的並不直接是值的內容而是值的地址。比如:
$a = 1;
從表面上看起來似乎是 $a 直接儲存了 1 這個值。但是實際情況是,PHP 直譯器建立了變數 $a ,
將值 1 存入記憶體中的某個地方,再將值的地址存到變數中。
需要取值時,先找到變數中 $a 的地址,再根據地址找到變數的值。
比如:
echo $a;
當我們執行上面這個語句時,會輸出 1 ,但是 PHP 直譯器會完成這樣一段程式碼:找到 $a 中儲存
的地址(即:先取 $a 的地址),根據地址找到存在記憶體中某個地方的值,最後輸出螢幕上。
用程式碼表示一下這個過程:
$a = 1; $b = &$a;
我們看到上面出現了一個 & 符號,這個符號是取地址符,可以取出變數 $a 中存的地址,並存儲到變數
$b 中,再使用輸出語句:
echo $b;
結果也是輸出 1 ,PHP 直譯器先取出 $b 中存的地址,再根據地址找到值。下面我們再做一個演示:
$a = 1; $b = &$a; $a = 2; echo $b;
會發現改變 $a 的值,$b 的值也跟著改變了。其實改變 $b 的值,$a 的值也會隨著改變。
到這一步,我們能確定的是在 $a 和 $b 中儲存了相同的地址,所以,他們指向的值也是一樣的。
結論1:如果兩個變數儲存了相同的地址,它們就是同一個變數。
下面我們來看一下 值型別 和 引用型別。
先看一段程式碼:
$a = 1; $b = $a; $a = 2; echo $b; // 輸出 1
將 $a 賦值給 $b,改變 $a 的值,$b 的值不變,根據上面我們得到的結論,$a 和 $b 是兩個不同的變數,
指向不同的地址。
結論2:賦值時會建立不同的變數的形式稱之為值型別。
再看一段程式碼:
class User { public $name = "Tome"; } $a = new User(); $b = $a; $a->name = "Joe"; echo $b->name;// 輸出 Joe
在這裡我們同樣把 $a 的值賦值給 $b,改變 $a 後,$b 的值也跟著發生了變化,根據結論1我們知道 $a 和 $b
是同一個變數,指向相同的地址。
結論3:賦值時不會建立新的變數的形式稱之為引用型別。
在 PHP 中字串、整型、浮點、陣列等這些都是值型別,而類和物件是引用型別。