gpt4 book ai didi

php - stdClass 动态成员 - 内存耗尽

转载 作者:可可西里 更新时间:2023-11-01 00:39:38 24 4
gpt4 key购买 nike

问题很简单:我有一个像

{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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com