【问题标题】:php: stdclass array element changed after referencing element via pointerphp:通过指针引用元素后stdclass数组元素发生了变化
【发布时间】:2014-04-19 14:14:15
【问题描述】:

伙计们。通过指针引用标准类数组元素时,我偶然发现了一种奇怪的情况。本示例运行于 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" ???

第一个 printr 语句显示

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 问题,还是我没有正确看待这个问题?

【问题讨论】:

    标签: php arrays stdclass


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-10
      • 1970-01-01
      • 1970-01-01
      • 2021-08-04
      • 1970-01-01
      • 1970-01-01
      • 2016-08-29
      • 1970-01-01
      相关资源
      最近更新 更多