1. 程式人生 > >圖文解析對象的賦值操作是“傳值”還是“傳址”

圖文解析對象的賦值操作是“傳值”還是“傳址”

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",歡迎不吝賜教,同時如果大家有其他疑問或見解,歡迎一起分享交流。我們共同學習,共同交流,共同進步。

技術分享

圖文解析對象的賦值操作是“傳值”還是“傳址”