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