php-对类持久化的引用

我通过循环创建了一堆基本类的实例.
每次迭代时,我都将实例添加(通过引用而不是复制)到数组中.

为什么在循环之后,数组中的每个引用都指向最后创建的实例?

进行未设置似乎可以解决此问题,但是我认为这不是理想的选择,并且可能会从内存中取消设置基础实例.

<?php
//foobars remembers something
class FOOBAR{
    public $val;
    public function __construct(&$input){
        $this->val = $input;
    }
};

//after creating foobars, pass them to a list
$list1 = [];
for($i=1; $i<=5; $i++){
    //create an instance of foobar
    $random = rand(1, 10);
    $instance = new FOOBAR($random);
    $list1[] = &$instance;

    // Using unset (below) fixes it?
    //unset($instance);
}

//show what our foobars remembered
var_dump(json_encode($list1));
?>

解决方法:

这是你的问题:

$list1[] = &$instance;

数组中的项目包含对$instance变量的引用.一旦更改了该变量(在您的情况下为循环的下一次迭代中),数组中的项目就会引用新创建的项目.

因此,循环之后,数组中的所有条目都引用了您创建的最后一个对象.

你需要:

$list1[] = $instance;
上一篇:java-如何在循环内声明新变量不会产生错误?


下一篇:python-如何根据另一列中的值减去df中的行