2

我希望通过 ref 将 xml 节点传递给函数,并在函数内进行更改。但是似乎无法以这种方式更改节点的值。

例子:

<?php
$str = '<data><name>foo</name></data>';
$xml = simplexml_load_string($str);

test($xml->name);

echo $xml->name; //I expect it should be 'bar', but it is still 'foo'.

function test(&$node){  //it makes no difference if a '&' is added or not.
    $node = 'bar';
}
?>

或者如果我在这里犯了错误?

4

1 回答 1

1

您在那里犯了一个小错误:您将字符串分配给'bar'变量 reference $node,即用字符串替换由该变量命名的对象(id)值。相反,您需要将对象保留在该变量中,并且只更改 that 的节点值SimpleXMLElement。这是通过所谓的自我引用完成的:

function test(&$node) {
    $node[0] = 'bar';
}

如您所见,[0]在该节点上添加会有所不同。这里&实际上不需要,因为对象不需要通过引用传递。此外,您还应该提示类型:

function test(SimpleXMLElement $node) {
    $node[0] = 'bar';
}

就是这样,请参阅演示:https ://eval.in/108589 。

为了更好地理解这里 SimpleXMLElement 自引用背后的魔力,请继续阅读以下答案,该答案是关于仅通过它的变量删除节点,这类似于设置它的值。请注意,这SimpleXMLElement魔法有关,因此乍一看可能并不直观。

于 2014-03-03T16:58:37.180 回答