如何使用减号访问对象属性?

13

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

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

但是由于减号的存在,我无法打印“预选”。
echo $object->pre-selection; //doens't work.

我该如何打印这个?谢谢。

可能是从一个对象中获取具有$符号属性的php变量的重复问题 - 还有其他类似/常见的问题。我仍然想知道这在PHP手册中确切的文档位置。 - hakre
另一个相关的问题:获取作为数字的PHP对象属性; 还有一个问题:php花括号对象属性访问问题 - hakre
2个回答

40
你可以尝试。
$object->{'pre-selection'};

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

另请参阅json_decode()的示例2。

示例#2 访问无效的对象属性

访问对象内包含违反 PHP 命名约定的字符(例如连字符)的元素,可以通过将元素名称用大括号和单引号括起来来实现。

<?php

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

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

?>

更新(感谢salathe):

花括号也可以用于清晰地界定属性名称。当访问包含数组的属性内部值时,当属性名称由多个部分组成或属性名称包含其他无效字符时,它们最为有用。


谢谢,我不知道你可以这么做 ;) 当我放置单引号时它能运行。$object->{'pre-selection'}; - Kevin Gorjan
那个链接指向的手册是关于其他事情的(不过写法有些相似)。 - hakre
语法在几个地方被提到。但是,在变量属性下没有提到。 - salathe
说句实话,我已经更新了“变量属性”部分,提到了花括号语法。(更改将在下周末更新后可见。) - salathe

7

有多种方法,问题在于PHP分词器会在代码中的-符号处出现故障,但您可以编写代码以使解析器不会发出投诉:

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

或者

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

或者

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

在这些情况下,PHP解析器不再运行在原始代码中出现问题的位置。想知道这个在哪里有文档记录?例如在SimpleXML文档中:链接

Accessing elements within an XML document that contain characters not permitted under PHP's naming convention (e.g. the hyphen) can be accomplished by encapsulating the element name within braces and the apostrophe.

Example #3 Getting <line>

<?php
include 'example.php';

$movies = new SimpleXMLElement($xmlstr);

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

The above example will output:

PHP solves all my web problems

谢谢,我已经找到了解决方案。我已将其添加到我的问题中。感谢大家的快速回复。 - Kevin Gorjan
@KevinGorjan_ 另一种方法是先转换为数组。实际上有很多通往罗马的道路。 - hakre

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接