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 中字符串、整型、浮點、數組等這些都是值類型,而類和對象是引用類型。
