【问题标题】:PHP object arguments behaviourPHP 对象参数行为
【发布时间】: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


【解决方案1】:

因为在 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;

【讨论】:

  • 那么该函数中没有办法只修改对象的副本吗?
  • 如果你克隆,你应该添加一个return语句来获取你所做修改的对象
【解决方案2】:

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

【讨论】:

  • 变量引用!= 对象引用。它们是不同的概念,具有不同的效果。不要混淆他们......
猜你喜欢
  • 2018-10-20
  • 1970-01-01
  • 2014-07-29
  • 1970-01-01
  • 2022-01-20
  • 1970-01-01
  • 1970-01-01
  • 2012-01-21
  • 1970-01-01
相关资源
最近更新 更多