PHP函数改变值的oblect,即使通过值传递

时间:2019-08-13 08:54:37

标签: php

我遇到了这个问题,并最终将其追踪到函数内部的Object值更改会影响函数外部的对象。

    function fnc1($data)
{
    foreach($data as $i=>$obj)
        if(!isset($x))$obj->dtObj = date('Y-m-d');
}

for($n=0;$n<5;$n++)
{
    $tmp = new stdclass;
    $tmp->dtObj = new DateTime(date("Y-m-d H:0$n:s"));
    $data[] = $tmp;
}
fnc1($data);
print_r($data);

输出;

 Array (
 [0] => stdClass Object
     (
         [dtObj] => 2019-08-13
     )

 [1] => stdClass Object
     (
         [dtObj] => 2019-08-13
     )

 [2] => stdClass Object
     (
         [dtObj] => 2019-08-13
     )

 [3] => stdClass Object
     (
         [dtObj] => 2019-08-13
     )

 [4] => stdClass Object
     (
         [dtObj] => 2019-08-13
     )
  )

这正常吗,PHP是如何工作的?如果要避免这种情况发生,我必须将serialized数据发送到函数吗?

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

如PHP用户贡献的注释中所述;

  

使用“->”时,您当然会访问相同的内容   内部函数作为调用程序函数中的原始变量。

整个注释必读: There seems to be some confusion here. The distinction between pointers and references is not particularly helpful....

然后继续说明各种情况