PHP中對象是按值傳遞還是按引用傳遞?

1.首先,什麼是按值傳遞和按引用傳遞?

按值傳遞就是僅僅把值傳遞過去,相當於傳遞的是值的拷貝,而按引用傳遞傳遞的是內存的地址。

在 PHP5 中,如果按引用傳遞,就是將 zval 的地址賦給另一個變量,這時,兩個變量都同時指向一個 zval 。而按值傳遞則是複製一個 zval,兩個變量指向兩個不同的 zval 。(爲了簡化,這裏忽略 copy on write)


按引用傳遞的特點:

$a = 2;

$b = &$a; //按引用傳遞

$a = 1;

echo $b; //1

$b = 3;

echo $a; //3


2.現證明PHP中對象不是按引用傳遞:

class Test{

    public $a ;

}

$test1 = new Test();

$test2 = $test1;  


$test1 = null;

var_dump($test1);   // null

var_dump($test2);   //object  如果是按引用傳遞,那麼$test2也應該爲空!


3.但是,傳遞對象的時候,也出現了引用傳遞的特點:


class Test{

    public $a ;

}

$test1 = new Test();

$test1->a = '1';

$test2 = $test1;  

$test2->a = '2';

echo $test1->a;  //2

$test1->a = '3';

echo $test2->a;  //3


出現這種情況的原因,是因爲在 PHP5 中,真正保存對象的結構是 zend_object,一個變量(zval)裏實際保存的是指向該結構體的指針。傳遞這個變量時,就是拷貝該指針的副本,而這個指針指向存儲堆區的對象。


其實,PHP 中所有的傳遞默認都是按值傳遞的,這點與 C、JavaScript 等語言相同。要想按引用傳遞,則必須使用 & 。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章