在PHP中通过引用迭代并编辑SimpleXML对象

时间:2013-06-13 17:07:36

标签: simplexml pass-by-reference php

我正在编写一个函数来解密SimpleXML对象的内容。

function xmlWalkerDecrypt(&$xmlObj, $aesKey) { 
    if ($xmlObj->count()>0){
        foreach($xmlObj as &$child){      //line 154
            xmlWalkerDecrypt($child, $aesKey);
        }
    }
    else{
        $xmlObj = companyAES($xmlObj, $aesKey, 'decrypt');
    }
} 

这会在WAMP中抛出以下错误: Fatal error: An iterator cannot be used with foreach by reference in C:\wamp\www\_assets\walk.php on line 154

是否可以迭代SimpleXML对象以便通过引用进行编辑,而不是输出?

我也试过了:

function xmlWalkerDecrypt(&$xmlObj, $aesKey) { 
if ($xmlObj->count()>0){
    foreach($xmlObj->children() as &$child){      //line 154
        xmlWalkerDecrypt($child, $aesKey);
    }
}
else{
    $xmlObj = companyAES($xmlObj, $aesKey, 'decrypt');
}
} 

但是会产生以下错误:

  

致命错误:无法在第154行的C:\ wamp \ www_assets \ myFile.php中创建对临时数组表达式元素的引用。

2 个答案:

答案 0 :(得分:0)

我不确定companyAES对传递给它的变量做了什么,但这里有两点可能会有所帮助:

  1. xmlWalkerDecrypt的参数1不需要声明为引用,因为PHP中的所有对象都是通过引用传递的,因此不需要将它放在函数声明中。您可能认为array()是一个对象,但它不是,但是新的ArrayObject()会创建一个对象。请参阅http://php.net/manual/en/class.arrayobject.php

  2. 您无法修改SimpleXMLElement,您只能读取或添加属性/子项。如果您需要在加载/添加XML节点后对其进行修改,则应使用DOMDocument&这是相关的课程。

答案 1 :(得分:0)

您很可能遇到需要自我修复元素以进行更改的问题:

$xmlObj[0] = companyAES($xmlObj, $aesKey, 'decrypt');
       ###

以前的问题记录了这一点:

此外,没有必要通过引用传递这些SimpleXMLElement对象。因此,您可以在foreach和参数定义中省去别名:

function xmlWalkerDecrypt(SimpleXMLElement $xmlObj, $aesKey) { 

    ...

    foreach ($xmlObj->children() as $child) {

    ...

应该这样做,这有效地通过错误消息处理报告的问题。只有现有变量可以别名(&),而不是临时数组表达式。