PHP对象参数行为

时间:2011-02-16 15:42:29

标签: php object reference arguments

采取这种情况:

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

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

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

编辑函数不会将参数作为参考,它不应该修改原始对象,为什么会发生这种情况呢?

2 个答案:

答案 0 :(得分: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 :(得分:1)

php中的类属性(以及javascript等其他语言)总是作为引用传递