13

我有一个对象(在 PHP 中),但我无法打印内容。在调试模式下是这样的:

stdClass Object
(
    [pre-selection] => 1
)

但由于减号,我无法打印“预选”。

echo $object->pre-selection; //doens't work.

我怎样才能打印出来?谢谢。

4

2 回答 2

39

你可以试试

$object->{'pre-selection'};

http://php.net/manual/en/language.types.string.php#language.types.string.parsing.complex

另见示例 2json_decode()

Example #2 访问无效的对象属性

访问对象中包含 PHP 命名约定不允许的字符(例如连字符)的元素可以通过将元素名称封装在大括号和撇号中来完成。

<?php

$json = '{"foo-bar": 12345}';

$obj = json_decode($json);
print $obj->{'foo-bar'}; // 12345

?>

更新(感谢salathe):

也可以使用花括号来明确界定属性名称。在访问包含数组的属性中的值、属性名称由多个部分组成或属性名称包含其他无效字符时,它们最有用

于 2012-08-13T18:34:21.587 回答
7

有多种方法,问题是 PHP 标记器会阻塞-代码中的符号,但是您可以编写它以便解析器不会抱怨:

echo $object->{'pre-selection'};

或者

$property = 'pre-selection'
echo $object->$property;

或者

$array = (array) $object;   
echo $array['pre-selection'];

在这些情况下,PHP 解析器不会在原始代码中存在无法解析的问题的地方运行。


想知道这是在哪里记录的。例如在SimpleXML 文档中:

访问 XML 文档中包含 PHP 命名约定不允许的字符(例如连字符)的元素,可以通过将元素名称封装在大括号和撇号中来完成。

Example #3 获取 <line>

<?php
include 'example.php';

$movies = new SimpleXMLElement($xmlstr);

echo $movies->movie->{'great-lines'}->line;
?>

上面的示例将输出:

PHP solves all my web problems
于 2012-08-13T18:37:19.087 回答