为什么改变一个对象的值可以改变另一个对象的所有值


why change value in 1 object can change all value another object?

当我想回答别人的问题时,我偶然发现了这个问题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??
*/
?>

重新解释问题

in CASE 1: i try to change last object value (albert) into (john)。结果是只有最后一个数组将更改为(john)。[I KNOW THIS]

IN CASE 2:我用不同的方式生成相同的数组,然后我尝试像在CASE 1中一样的事情。但是结果是将[name]全部更改为[john],而不是让对象1中的[name]更改为(albert),并将对象2中的[name]更改为(john)

我努力知道这个,但仍然不能从谷歌找到答案。我发现了一些,但仍然不能解释清楚我^_^7

我非常感谢任何解释。由于
@Rizier123的回答
$data= array($obj, $obj); $data= array($obj1, $obj2);

是的,它在显示上类似,但在计算机内存中不同

$data = array(
    (object) $array, //computer maybe save it as $obj1 or any variable that i dont know the name XD
    (object) $array //computer maybe save it as $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