Php 为什么更改一个对象中的值可以更改另一个对象中的所有值?

Php 为什么更改一个对象中的值可以更改另一个对象中的所有值?,php,arrays,Php,Arrays,当我想回答某人的问题XD时,我意外地发现了这个问题 <?php /* why change value in 1 object can change all value another object? */ function prints($a) { echo "<pre>"; print_r($a); echo "</pre>"; } //CASE 1 : create object from array $array = array(

当我想回答某人的问题XD时,我意外地发现了这个问题

<?php
/*
why change value in 1 object can change all value another object?
*/

function prints($a)
{
    echo "<pre>";
    print_r($a);
    echo "</pre>";
}

//CASE 1 : create object from array
$array = array(
    'id' => 1,
    'name' => 'albert'
);
$data = array(
    (object) $array,
    (object) $array
);
prints($data);
/*output
Array
(
    [0] => stdClass Object
        (
            [id] => 1
            [name] => albert
        )

    [1] => stdClass Object
        (
            [id] => 1
            [name] => albert
        )
)
*/


//CASE 2 : change value 2nd object of 2nd array 
$data[1]->name = 'john';
prints($data);
/* output
Array
(
    [0] => stdClass Object
        (
            [id] => 1
            [name] => albert
        )

    [1] => stdClass Object
        (
            [id] => 1
            [name] => john
        )
)
no question about this. 
only 2nd object of 2nd object will change
its know this clearly
*/

//create same object with different way
$obj = new stdClass();
$obj->id=1;
$obj->name='albert';
$data= array($obj, $obj);
prints($data);
/*output: this will be same as $data array in above
Array
(
    [0] => stdClass Object
        (
            [id] => 1
            [name] => albert
        )

    [1] => stdClass Object
        (
            [id] => 1
            [name] => albert
        )
)
*/

//THE PROBLEM
//change value 2nd object of 2nd array 
$data[1]->name="john";
prints($data);
/*output
Array
(
    [0] => stdClass Object
        (
            [id] => 1
            [name] => john
        )

    [1] => stdClass Object
        (
            [id] => 1
            [name] => john
        )

)
All key name in object will change to john , instead of only the 2nd.
How this could happen??
*/

?>

重新解释这个问题

在案例1中:我尝试将最后一个对象值(albert)更改为(john)。结果是最后一个数组将更改为(john)[我知道这一点]

案例2中:我用不同的方法生成相同的数组,然后尝试与案例1中相同的事情。但结果是所有的[name]都改为[john],而不是让对象1中的[name]为(albert),而将对象2中的[name]改为(john)

我很难知道这一点,但仍然无法从谷歌找到答案。 我找到了一些,但仍然无法向我解释清楚

我非常感谢你的解释。谢谢

来自@Rizier123的答案

在案例2中:我从同一对象创建数组:$data=array($obj,$obj)

在案例1中:我从不同的对象创建数组:$data=array($obj1,$obj2)

是的,它在显示上很相似,但在计算机内存上却不同

<?php
$array = array(
    'id' => 1,
    'name' => 'albert'
);
$obj1= (object) $array;
$obj2= (object) $array;
$obj3= (object) $array;
//CASE 1
$data = array($obj1, $obj2); //different object although it have same component

//CASE 2
$data = array($obj3, $obj3); //same object

?>
这是最后的代码解释



谢谢@Rizier123

有什么问题吗。创建并填充一个数组,然后创建第二个数组,并使用前一个数组填充,然后将它们转换为对象。这有什么不对?默认情况下,对象是通过引用指定的。因此,在第二个示例中,使用指向相同数据的相同对象。另见手册页:@Rizier123你能用一个例子重新解释一下你的答案吗,因为我还是不明白。我会感谢你的帮助help@plonknimbuzz . 在第二个示例中,两个对象都指向内存中的相同数据
<?php
$array = array(
    'id' => 1,
    'name' => 'albert'
);
$obj1= (object) $array;
$obj2= (object) $array;
$obj3= (object) $array;
//CASE 1
$data = array($obj1, $obj2); //different object although it have same component

//CASE 2
$data = array($obj3, $obj3); //same object

?>