php:stdclass数组元素在通过指针引用元素后发生了更改


php: stdclass array element changed after referencing element via pointer

各位。在通过指针引用标准类数组元素时,我偶然发现了一个奇怪的情况。此示例在php 5.4.3、windows XP、Apache 上运行

$myLittleArray = array();
$myLittleArray[0] = new stdClass;
$myLittleArray[0]->fruit = 'apple';
$myLittleArray[1] = new stdClass;
$myLittleArray[1]->fruit = 'banana';
$myLittleArray[2] = new stdClass;
$mla = &$myLittleArray[2];
$mla->fruit = 'kiwi';
print_r($myLittleArray);   // $myLittleArray[2]->fruit  displays as "kiwi"
foreach ($myLittleArray as $mla){
   $mla->pricePerPound = 0.0;
}
print_r($myLittleArray);   // $myLittleArray[2]->fruit  displays as "banana" ???

第一个打印机语句显示

Array
(
[0] => stdClass Object
    (
        [fruit] => apple
    )
[1] => stdClass Object
    (
        [fruit] => banana
    )
[2] => stdClass Object
    (
        [fruit] => kiwi
    )
}

第二个printr语句(注意$myLittleArray[2]->fruit已更改为"banana"

Array
(
[0] => stdClass Object
    (
        [fruit] => apple
        [pricePerPound] => 0
    )
[1] => stdClass Object
    (
        [fruit] => banana
        [pricePerPound] => 0
    )
[2] => stdClass Object
    (
        [fruit] => banana
        [pricePerPound] => 0
    )
)
*/

如果我在最后一个foreach中使用不同的变量名,比如$mla1,那么代码将按预期工作($myLittleArray[2]->fruit == 'kiwi')。这是php的问题,还是我没有正确看待这个问题?

这是因为您之前将$mla作为对$myLittleArray[2]的引用。当foreach每次通过循环分配给$mla时,实际上是分配给$myLittleArray[2]。因此,第一次通过循环将$myLittleArray[2]设置为$myLittleArray[0]的副本,第二次将$myLittleArray[2]设置为$myLittleArray[1]的副本。