PHP中對象是按值傳遞還是按引用傳遞?
PHP中對象是按值傳遞還是按引用傳遞?
1.首先,什么是按值傳遞和按引用傳遞?
按值傳遞就是僅僅把值傳遞過去,相當于傳遞的是值的拷貝,而按引用傳遞傳遞的是內存的地址。
在 PHP 中,如果按引用傳遞,就是將 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時,另一個也為null。
$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,看起來跟引用沒差別,是吧
//****************************
出現這種情況的原因,是因為在 PHP 中,真正保存對象的結構是 zend_object *obj,這是一個指針
而這個指針是$test1的值的一部分構成(詳見zval,不細述)。
傳遞這個變量的值時$test2 = $test1,就把這個指針拷貝給了$test2。
但$test1 和 $test2的地址都不是zend_object obj 這個指針,
zend_object obj 僅僅是$test1 和 $test 的值中的一個屬性。
//****************************
知止而后有定,定而后能靜,靜而后能安,安而后能慮,慮而后能得。
所謂誠其意者,毋自欺也。

浙公網安備 33010602011771號