【问题标题】:why the object $result have been changed为什么对象 $result 已更改
【发布时间】:2015-08-18 07:42:21
【问题描述】:

我有一些代码,比如吹,

class Tool{
    function getData(){
        $res = array('name'=>'jay','age'=>22,'job'=>'developer','ID'=>1233211234567);
        $res = (object)$res;
        var_dump(111,$res);
        $resLog = $res;
        $this->resFilter($resLog);
        var_dump(222,$res);
        //...log code
    }
    function resFilter($res){
        unset($res->ID);
    }
}
echo '<pre>';
$t = new Tool;
$t->getData();
die;

我怀疑为什么在函数getData 中调用函数resFiltervar_dump(222,$res); 会是这样的:

int(111)
object(stdClass)#2 (4) {
  ["name"]=>
  string(3) "jay"
  ["age"]=>
  int(22)
  ["job"]=>
  string(9) "developer"
  ["ID"]=>
  int(1233211234567)
}
int(222)
object(stdClass)#2 (3) {
  ["name"]=>
  string(3) "jay"
  ["age"]=>
  int(22)
  ["job"]=>
  string(9) "developer"
}

所以你可以在 var_dump 的第二部分看到没有 ID 字段?谁能帮助我,告诉我为什么?

更新: 感谢您的回答,我试试这个$resLog = clone($res); 会正常工作。

【问题讨论】:

  • 您将$res 变量转换为对象
  • 我知道你说的意思,但我不知道为什么?

标签: php object


【解决方案1】:

最好的解释在这里,还有像你这样的例子:

http://php.net/manual/en/language.oop5.references.php

长话短说:当您应用 resFilter 方法时,您发送 $resLog 对象作为输入,并且该对象具有与 $res 相同的标识符,因为您创建了 $resLog = $res; 如果您有一个普通变量,但在方法中通过引用发送它。

当一个对象通过参数发送、返回或分配给另一个对象时 变量,不同的变量不是别名:它们持有 标识符,指向同一个对象

【讨论】:

    【解决方案2】:

    除非另有说明,否则 PHP 会实现浅拷贝。因此,当您复制对象时,您实际上并没有完全克隆它,而是使用引用。因此$this-&gt;resFilter($resLog); 调用也会删除引用对象中的ID 属性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-01
      • 1970-01-01
      相关资源
      最近更新 更多