为什么var_dump()说一个字符串是一个对象?

时间:2014-01-09 22:54:37

标签: php simplexml var-dump

我正在使用Amazon API检索产品信息,而响应(使用simplexml_load_string()转换为对象)如下所示:

SimpleXMLElement Object
(
    [Items] => SimpleXMLElement Object
        (
            [Item] => SimpleXMLElement Object
                (
                    [ASIN] => B00C9WDZIG
                    [ParentASIN] => B00C9WDZIG
                )
        )
)

输出:

var_dump($parsed_xml->Items->Item->ASIN);
var_dump($parsed_xml->Items->Item->ParentASIN);

就是这样:

object(SimpleXMLElement)[3]
  string 'B00C9WDZIG' (length=10)

object(SimpleXMLElement)[4]
  string 'B00C9WDZIG' (length=10)

我很困惑,因为var_dump()正在输出对象而不是字符串。这是为什么?第三个ASIN对象中不包含ParentASINSimpleXMLElement个字符串值吗?

换句话说,我期望输出为:

string 'B00C9WDZIG' (length=10)

string 'B00C9WDZIG' (length=10)

我很困惑,为什么不是。

任何人都能解释一下吗?

1 个答案:

答案 0 :(得分:4)

SimpleXML是一个链式对象。它具有欺骗性,因为你可以做类似

的事情
echo (string)$xml->tag;

获得<tag>value</tag>之类的值。但tag也是SimpleXML的一个实例,因为您可能需要仍然获取属性或子项。所以var_dump是正确的。

让我进一步解释。这里有一些示例XML

<xml>
  <mytag>
    <skate>roll</skate>
    <surf>swim</surf>
  </mytag>
</xml>

当我们将它转​​储到SimpleXMLElement(SXE)时,我们得到的是SXE的一个实例。所以顶级对象是我们的整体包装器<xml>,我们会说我们将其转储到$xml。下一级是$xml->mytag。这也是一个SXE对象。 $xml->mytag->skate$xml->mytag->surf也是如此。如果你这样做

var_dump($xml->mytag->surf);

它也会告诉你。它需要这样,因为我们想要修改XML。我们可以直接进入

$xml->mytag->addChild('skydive', 'fall');
echo $xml->asXML();

哪个输出

<xml>
  <mytag>
    <skate>roll</skate>
    <surf>swim</surf>
    <skydive>fall</skydive>
  </mytag>
</xml>