2016年8月8日 星期一

PHP 將物件傳到 function 時,有用 & 和沒用 & 的差異

PHP 在 function 間傳遞物件時,沒用 & (pass by identifier)和 有用 & (pass by reference),兩者用起來雖然差不多,但嘗試將負責傳遞的物件變數,整個重新指定為其他東西時,會有不同的結果。

[ 沒用 & (使用識別符號傳遞) ]
[ pass by identifier(a reference to a reference) ]
class test{
    public $v = 123;
}

function change1($a){
    $a->v = 999;
}
function change2($a){
    $a = 222; //不能改變 $a = new test() 這個物件
}

$a = new test();
var_dump($a);

change1($a);
var_dump($a);

change2($a);
var_dump($a);
結果:
object(test)#1 (1) {
  ["v"]=>
  int(123)
}
object(test)#1 (1) {
  ["v"]=>
  int(999)
}
object(test)#1 (1) { //不能改變 $a = new test() 這個物件
  ["v"]=>
  int(999)
}



[ 用 & (使用參考傳遞) ]
[ pass by reference ]
class test{
    public $v = 123;
}

function change1(&$a){
    $a->v = 999;
}
function change2(&$a){ //可以改變 $a = new test() 這個物件
    $a = 222;
}

$a = new test();
var_dump($a);

change1($a);
var_dump($a);

change2($a);
var_dump($a);
結果:
object(test)#1 (1) {
  ["v"]=>
  int(123)
}
object(test)#1 (1) {
  ["v"]=>
  int(999)
}
int(222)  //可以改變 $a = new test() 這個物件


參考:
PHP: Passing by Reference - Manual
PHP: Objects and references - Manual
variables - How do you pass objects by reference in PHP 5? - Stack Overflow

沒有留言:

張貼留言