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 等語言相同。要想按引用傳遞,則必須使用 & 。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM