圖文解析對象的賦值操作是“傳值”還是“傳址”
阿新 • • 發佈:2017-10-30
on() n) bject kff 過程 nbsp imp order 一個表
我們知道,變量默認總是傳值賦值。也就是說,當將一個表達式的值賦予一個變量時,整個原始表達式的值被賦值到目標變量。這意味著,當一個變量的值賦予另外一個變量時,改變其中一個變量的值,將不會影響到另外一個變量。
舉個簡單例子:
<?php $a = ‘hello world‘; $b = $a; $a = ‘bey world‘; var_dump($a); var_dump($b); ?>
此時的$b = $a,在內存中的存貯大致是這樣子的:
但是當一個對象被實例化後,對象的傳遞並非傳值,而是傳遞該對象的地址。也就是說,不會復制整個對象,因為這樣做既耗時又耗內存。
同樣舉個簡單例子:
<?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;
當把一個對象實例賦給一個新變量時,新變量會訪問同一個實例。
引用賦值(&)意味著新的變量引用了原始變量,換言之,成為其"別名" 或者 "指向"。改動新的變量將影響到原始變量,反之亦然。
$a = null;
也許你會問,既然直接賦值不是復制對象,那如何才能復制對象呢?PHP裏克隆復制對象使用clone操作符:
$f = new Person(); $b = clone $f; //創建一個對象副本
小結
通過本文,我們一起分享了在PHP中對象的賦值操作,傳遞的是對象地址,而不是復制對象。PHP中可以使用clone操作符來復制對象。能力有限,如果大家發現本文有"bug",歡迎不吝賜教,同時如果大家有其他疑問或見解,歡迎一起分享交流。我們共同學習,共同交流,共同進步。
圖文解析對象的賦值操作是“傳值”還是“傳址”