采取这种情况:
function edit($var)
{
$var->test = "foo";
}
$obj = new stdClass;
edit($obj);
echo $obj->test; //"foo"
编辑函数不会将参数作为参考,它不应该修改原始对象,为什么会发生这种情况呢?
答案 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等其他语言)总是作为引用传递