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