採取這樣的情況:PHP對象參數行爲
function edit($var)
{
$var->test = "foo";
}
$obj = new stdClass;
edit($obj);
echo $obj->test; //"foo"
編輯功能不佔用參數作爲參考,它不應該修改原來的對象,爲什麼會發生這種情況?
採取這樣的情況:PHP對象參數行爲
function edit($var)
{
$var->test = "foo";
}
$obj = new stdClass;
edit($obj);
echo $obj->test; //"foo"
編輯功能不佔用參數作爲參考,它不應該修改原來的對象,爲什麼會發生這種情況?
因爲在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;
類在PHP屬性(以及其他語言如javascript)總是作爲參考傳遞
可能的重複:http://stackoverflow.com/questions/1107016/are-objects-in-php-passed-by-value-or-reference – Will 2011-02-16 15:45:19
可能的重複[在PHP中,有人可以解釋克隆vs指針引用?](http:// stackoverfl ow.com/questions/3611986/in-php-can-someone-explain-cloning-vs-pointer-reference) – ircmaxell 2011-02-16 15:55:28
@ircmaxell:很好找。 – BoltClock 2011-02-16 16:05:01