這篇文章介紹的內容是關於圖文解析PHP對象的賦值操作是“傳值”還是“傳址”,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下
我們知道,變數預設總是傳值賦值。也就是說,當將一個表達式的值賦予一個變數時,整個原始表達式的值會被賦值到目標變數。這意味著,當一個變數的值賦予另一個變數時,改變其中一個變數的值,將不會影響到另一個變數。
舉個簡單例子:
<?php $a = 'hello world'; $b = $a; $a = 'bey world'; var_dump($a); var_dump($b); ?>
此時的$b = $a,在記憶體中的存貯大致是這樣子的:
但是當一個物件被實例化後,物件的傳遞並非傳值,而是傳遞該物件的位址。也就是說,不會複製整個對象,因為這樣做既耗時又耗記憶體。 <br/>同樣舉個簡單例子:
<br/>
<?php class Person { public $name; public $age; } $a = new Person(); $b = $a; $c = &$a; $a->name = 'gavin'; $a = null; var_dump($b); var_dump($a); var_dump($c);
執行結果:
object(Person)#1 (2) { ["name"]=> string(5) "gavin" ["age"]=> NULL } NULL NULL
上面範例中變數的操作過程大致如下:
$b = $a; $c =& $a;
當把一個物件實例賦給一個新變數時,新變數會存取同一個實例。 <br/>引用賦值(&)意味著新的變數引用了原始變量,換言之,成為其"別名" 或 "指向"。改動新的變數將影響到原始變量,反之亦然。 <br/>
$a = null;
也許你會問,既然直接賦值不是複製對象,那如何才能複製物件呢? PHP複製複製物件使用clone運算子:
$f = new Person(); $b = clone $f; //创建一个对象副本
以上是圖文解析PHP物件的賦值運算是'傳值”還是'傳址”的詳細內容。更多資訊請關注PHP中文網其他相關文章!