将eval用于动态嵌套对象

时间:2012-01-10 18:42:43

标签: php eval

对于SOAP服务,我必须生成一个对象,该对象可以具有任意数量的相同类型的嵌套对象。我提出的唯一可行解决方案是使用eval。我稍微简化了代码,实际上$ nestedObjArray中的对象要大得多。

$nestedObjArray = array();
$nestedObjArray[] = new stdClass();
$nestedObjArray[] = new stdClass();
$nestedObjArray[] = new stdClass();

$finalObj = new stdClass();
for ($i = 0; $i < count($nestedObjArray); $i++) {
    $nestedStr = str_repeat("->nested", $i);
    eval('$finalObj->nested'.$nestedStr.' = $nestedObjArray[$i];');
}

生成以下3个语句:

$finalObj->nested = $nestedObjArray[0];
$finalObj->nested->nested = $nestedObjArray[1];
$finalObj->nested->nested->nested = $nestedObjArray[2];

这很好用,但很难看。谁能想到更优雅的解决方案?顺便说一句,以下而不是eval行不起作用:

$finalObj->nested{$nestedStr} = $nestedObjArray[$i];

3 个答案:

答案 0 :(得分:1)

使用参考变量

怎么样?
$finalObj = new stdClass();
$addToObject = $finalObj;
for ($i = 0; $i < count( $nestedObjArray ); $i ++) {
    $addToObject->nested = $nestedObjArray[$i];
    $addToObject = $addToObject->nested;
}

PS变量属性的正确语法是$finalObj->nested->{$nestedStr}

PPS我只是想知道这个目的是什么?

答案 1 :(得分:1)

这个怎么样:

$nestedObjArray = array();
$nestedObjArray[] = new stdClass();
$nestedObjArray[] = new stdClass();
$nestedObjArray[] = new stdClass();

$finalObj = new stdClass();
$thisObj = &$finalObj;
for ($i = 0; $i < count($nestedObjArray); $i++) {
    $thisObj->nested = $nestedObjArray[$i];
    $thisObj = &$thisObj->nested;
}

或者即使你想要删除其中的两行,这个:

$nestedObjArray = array();
$nestedObjArray[] = new stdClass();
$nestedObjArray[] = new stdClass();
$nestedObjArray[] = new stdClass();

$finalObj = new stdClass();
for ($i = 0, $thisObj = &$finalObj; $i < count($nestedObjArray); $i++, $thisObj = &$thisObj->nested) {
    $thisObj->nested = $nestedObjArray[$i];
}

答案 2 :(得分:1)

你真正应该做的是保留一个指向内部对象的单独变量。例如......

$finalObj = new stdClass();
$innerObj = $finalObj;
for($i = 0; $i < count($nestedObjArray); $i++) {
    $innerObj->nested = $nestedObjArray[$i];
    $innerObj = $innerObj->nested;
}