【问题标题】:Iterating through and editing a SimpleXML object by reference in PHP在 PHP 中通过引用迭代和编辑 SimpleXML 对象
【发布时间】:2013-06-10 04:32:34
【问题描述】:

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

【问题讨论】:

标签: simplexml pass-by-reference php


【解决方案1】:

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

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

这在较早的问题中有记录:

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

function xmlWalkerDecrypt(SimpleXMLElement $xmlObj, $aesKey) { 

    ...

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

    ...

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 两个澄清:首先,new Array() 在 PHP 中不起作用(您甚至不能使用该名称创建自定义类),所以 array()从不一个东西。其次,对象指针和引用之间存在细微差别,但您是对的,在大多数情况下,可以将对象视为“始终通过引用传递”。
    • 其实第三点:可以修改一个SimpleXMLElement——$foo[0] = 'hello'会覆盖文本内容为字符串hello。你不能做太多修改,但有些是可能的。
    • @IMSoP 你在两个方面都是对的:1. 我的意思是 ArrayObject 对象。我已经更新了我的答案。 2. 引用和指针之间存在巨大差异,但从用户的角度来看,PHP 没有——你不能像 C++ 等其他语言那样显式创建指针变量
    • 我说的是“对象指针”/“对象引用”,而不是 C 意义上的“指针”;我不知道一个好的明确的术语来形容他们。关键是它们是不同于变量引用的 second 间接级别。您可以在 PHP 中通过引用分配对象变量,这确实与按值分配不同。试试这个:$a = new stdClass; $b =& $a; $b = 1; echo $a;(与 = 代替 =& 相比)。
    猜你喜欢
    • 2011-08-12
    • 2021-11-28
    • 2021-12-13
    • 2013-03-23
    • 2011-03-16
    • 1970-01-01
    • 1970-01-01
    • 2021-12-25
    • 1970-01-01
    相关资源
    最近更新 更多