2

我正在编写一个函数来解密 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 中创建对临时数组表达式元素的引用`

4

2 回答 2

0

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

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

  2. 您不能修改 SimpleXMLElement,只能从中读取或添加属性/子元素。如果您需要在加载/添加 XML 节点后对其进行修改,您应该使用 DOMDocument 及其相关类。

于 2013-06-13T20:10:24.353 回答
0

您很可能遇到需要对元素进行自引用以更改它的问题:

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

这记录在较早的问题中:

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

function xmlWalkerDecrypt(SimpleXMLElement $xmlObj, $aesKey) { 

    ...

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

    ...

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

于 2013-06-22T12:57:21.970 回答