问题很简单:
我有一个像

{a:'A', b:'B'}

我希望它像
{a:'A', new_a:'A', b:'B', new_b:'B'}

使用的代码是:
<?php

$obj = new stdClass();
$obj->a = 'A';
$obj->b = 'B';

foreach($obj as $field=>$value)
{
    $obj->{'new_'.$field} = $value;
}

输出是:
Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 21290 bytes) in /path/to on line 9

第 9 行是这样的:
$obj->{'new_'.$field} = $value

我确实有解决问题的替代方法,但我不明白为什么这个特定的代码会产生这个错误。
有没有人知道这个错误的原因,最终解释一下。
谢谢!

最佳答案

问题是,当您迭代源对象属性时,您正在向源对象添加更多属性,因此 foreach 循环永远不会结束。

您可以通过向循环添加 var_dump 调用来看到这种情况:

foreach ($obj as $field => $value)
{
    $obj->{'new_'.$field} = $value;
    var_dump($obj);
}

结果是:

object(stdClass)#1 (29) {
  ["a"]=>
  string(1) "A"
  ["b"]=>
  string(1) "B"
  ["new_a"]=>
  string(1) "A"
  ["new_b"]=>
  string(1) "B"
  ["new_new_a"]=>
  string(1) "A"
  ["new_new_b"]=>
  string(1) "B"
  ["new_new_new_a"]=>
  ...

相反,创建一个新对象并替换旧对象:

$obj = new stdClass();
$obj->a = 'A';
$obj->b = 'B';

$newObj = new stdClass();

// Copy old properties
foreach ($obj as $field => $value) {
    $newObj->{$field} = $value;
}

// Create new properties
foreach($obj as $field => $value) {
    $newObj->{'new_' . $field} = $value;
}

甚至:

$obj = new stdClass();
$obj->a = 'A';
$obj->b = 'B';

$newObj = new stdClass();

// Copy old properties and create new
foreach ($obj as $field => $value) {
    $newObj->{$field} = $value;
    $newObj->{'new_' . $field} = $value;
}

关于php - stdClass 动态成员 - 内存耗尽,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48325318/

10-11 06:38