我正在编写一个函数来解密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中创建对临时数组表达式元素的引用。
答案 0 :(得分:0)
我不确定companyAES对传递给它的变量做了什么,但这里有两点可能会有所帮助:
xmlWalkerDecrypt的参数1不需要声明为引用,因为PHP中的所有对象都是通过引用传递的,因此不需要将它放在函数声明中。您可能认为array()是一个对象,但它不是,但是新的ArrayObject()会创建一个对象。请参阅http://php.net/manual/en/class.arrayobject.php
您无法修改SimpleXMLElement,您只能读取或添加属性/子项。如果您需要在加载/添加XML节点后对其进行修改,则应使用DOMDocument&这是相关的课程。
答案 1 :(得分:0)
您很可能遇到需要自我修复元素以进行更改的问题:
$xmlObj[0] = companyAES($xmlObj, $aesKey, 'decrypt');
###
以前的问题记录了这一点:
此外,没有必要通过引用传递这些SimpleXMLElement对象。因此,您可以在foreach和参数定义中省去别名:
function xmlWalkerDecrypt(SimpleXMLElement $xmlObj, $aesKey) {
...
foreach ($xmlObj->children() as $child) {
...
应该这样做,这有效地通过错误消息处理报告的问题。只有现有变量可以别名(&
),而不是临时数组表达式。