1. 程式人生 > >PHP變數的值型別和引用型別

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 中字串、整型、浮點、陣列等這些都是值型別,而類和物件是引用型別。