【问题标题】:Why is var_dump() saying a string is an object?为什么 var_dump() 说字符串是对象?
【发布时间】:2014-01-28 18:03:38
【问题描述】:

我正在使用 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() 输出的是对象而不是字符串。这是为什么? ASINParentASIN 字符串值不是在第三个 SimpleXMLElement 对象内吗?

换句话说,我希望输出是:

string 'B00C9WDZIG' (length=10)

string 'B00C9WDZIG' (length=10)

我很困惑为什么不是。

谁能解释一下?

【问题讨论】:

  • var_dump 显示值所包含的类型和值本身。 $test = array('1', '2'); var_dump($test); 会给array(2) [0] => 1, [1] => 2
  • 对simplexml一无所知,但您说您将其转换为对象,字符串是该对象的成员。 var_dump 只是给你一个确认。

标签: php simplexml var-dump


【解决方案1】:

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 实例。所以顶部对象是我们的整体包装器&lt;xml&gt;,我们会说我们将其转储到$xml。下一层是$xml-&gt;mytag。这也是一个 SXE 对象。 $xml-&gt;mytag-&gt;skate$xml-&gt;mytag-&gt;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>

【讨论】:

  • 救了我的回答。更直接地说:因为$parsed_xml-&gt;Items-&gt;Item-&gt;ASIN 不是字符串。它可以(隐式或显式)转换为字符串,但它仍然是一个对象。
  • @cincodenada 或 Machavity:那么 ASINParentASIN 是什么类型的对象?如果它们是对象而不是字符串,dump_var() 不应该显示类型吗?
  • 正如var_dump 告诉你的那样,它们都是SimpleXMLElement 的实例。这就是为什么在解析标记的值时,必须将其类型转换为 (string),因为对象本身实际上不是字符串。
  • 哦,我以为var_dump()ItemSimpleXMLElement Object,而ASINParentASIN 是该对象的属性/属性。
  • 你告诉 var_dump() 转储ASIN,它没有理由告诉你Item。它告诉你ASIN 是一个包含 字符串的对象,这有点奇怪,但如果你知道你在看什么会很有帮助:)
猜你喜欢
  • 2011-12-22
  • 1970-01-01
  • 2023-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多