2011-02-16 33 views
0

採取這樣的情況:PHP對象參數行爲

function edit($var) 
{ 
    $var->test = "foo"; 
} 

$obj = new stdClass; 
edit($obj); 

echo $obj->test; //"foo" 

編輯功能不佔用參數作爲參考,它不應該修改原來的對象,爲什麼會發生這種情況?

+1

可能的重複:http://stackoverflow.com/questions/1107016/are-objects-in-php-passed-by-value-or-reference – Will 2011-02-16 15:45:19

+1

可能的重複[在PHP中,有人可以解釋克隆vs指針引用?](http:// stackoverfl ow.com/questions/3611986/in-php-can-someone-explain-cloning-vs-pointer-reference) – ircmaxell 2011-02-16 15:55:28

+0

@ircmaxell:很好找。 – BoltClock 2011-02-16 16:05:01

回答

4

因爲在PHP 5中,對象的引用是按值傳遞的,而不是對象本身。這意味着您的函數參數$var和您的調用範圍變量$obj是對同一對象的不同引用。 This manual entry可能會幫助你。

要獲取對象的(淺)副本,請使用clone。爲了找回這個副本,不過,你需要返回它:

function edit($var) 
{ 
    $clone = clone $var; 
    $clone->test = "foo"; 
    return $clone; 
} 

$obj = new stdClass; 
$obj2 = edit($obj); 

echo $obj2->test; 

或指定給一個reference argument,然後調用它像這樣:

function edit($var, &$clone) 
{ 
    $clone = clone $var; 
    $clone->test = "foo"; 
} 

$obj = new stdClass; 
edit($obj, $obj2); 

echo $obj2->test; 
1

類在PHP屬性(以及其他語言如javascript)總是作爲參考傳遞