【发布时间】:2011-06-28 10:59:23
【问题描述】:
以这种情况为例:
function edit($var)
{
$var->test = "foo";
}
$obj = new stdClass;
edit($obj);
echo $obj->test; //"foo"
编辑函数不将参数作为引用,它不应该修改原始对象,为什么会发生这种情况?
【问题讨论】:
标签: php object reference arguments
以这种情况为例:
function edit($var)
{
$var->test = "foo";
}
$obj = new stdClass;
edit($obj);
echo $obj->test; //"foo"
编辑函数不将参数作为引用,它不应该修改原始对象,为什么会发生这种情况?
【问题讨论】:
标签: php object reference arguments
因为在 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)中的类属性总是作为引用传递
【讨论】: