如何修复节点名称的 simpleXML“警告:非法字符串偏移”?

How to fix simpleXML “Warning: Illegal string offset” for node name?

我使用 simpleXML 来解析来自服务器的一些 XML 响应,我是这样加载的:

$xml = simplexml_load_string($string);

它有一个唯一的 child,但不同的响应有不同的名称,所以我先得到 child 名称:

$node = $xml->children()->getName();

我创建了新的 object 响应并将其属性设置为我从 XML 字符串中读取的内容:

return (new Response())
    ->setTime((string)$xml['time'])
    ->setId((string)$xml->$node['id'])
    ->setResult((string)$xml->$node['result'])
    ->setBalance((string)$xml->$node->balance['value']);

这里出现了这个警告 - Illegal string offset 'id'Illegal string offset 'result'

我知道,$node实际上是一个字符串,但它用作响应中的节点名称。 如果我将代码更改为 ->setId((string)$xml->result['id']),警告就会消失。 问题是,在响应实际到来之前,我不知道节点的名称 (例如可以是“good_result”、“result_1”等)。 所以,'$node['id']' 不是请求字符串索引,而是请求节点的属性。 它看起来像 PHP 字符串索引语法和简单的 XML 节点名称语法之间的冲突。

  1. 代码本身工作正常,警告仅出现在 IDE
  2. simple有很多类似的问题XML,但是没有回答我的情况
  3. 我只需要删除那个警告,所以请回答如何在代码中修复它,或者接受删除此类警告

有两种可能的方式来解释这种形式的代码:

$object->$foo['bar'];
  • 7.0以后的PHP版本会查找$foo标识的属性,然后在结果上查找键'bar',也就是你想要。
  • 旧版本的 PHP 会先计算 $foo['bar'],然后根据该结果查找 属性。

您 IDE 中的警告采用旧的解释:它警告您 $foo['bar'] 没有意义,因为 $foo 是一个字符串。

除非您实际上 运行 您的代码是 PHP (5.6 hasn't had an official security update for over 2 years) 的古代版本,否则代码没有实际问题。您需要升级 IDE,或重新配置它,以便它以与实际 PHP 相同的方式解释代码。由于您没有提及 IDE 您使用的是什么,所以我不能说得更具体。