Как получить доступ к объекту со знаком минус?

У меня есть объект (в PHP), и я не могу распечатать его. В режиме отладки это выглядит так:

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

Но я не могу напечатать "предварительный выбор" из-за знака минус.

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

Как я могу распечатать это? Спасибо.

Ответ 1

Вы можете попробовать

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

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

См. также пример 2 json_decode()

Пример # 2 Доступ к свойствам недействительных объектов

Доступ к элементам внутри объекта, который содержит символы, не разрешенный в соответствии с соглашением об именовании PHP (например, дефис), может быть выполняется путем инкапсуляции имени элемента в фигурные скобки и апостроф.

<?php

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

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

?>

Обновление (спасибо salathe):

Можно также использовать фигурные скобки, чтобы четко разграничить имя свойства. Они наиболее полезны при доступе к значениям внутри свойства, содержащего массив, когда имя свойства составлено из нескольких частей, или , когда имя свойства содержит символы, которые в противном случае не действительны.

Ответ 2

Существует несколько способов, проблема заключается в том, что токенизатор PHP будет задыхаться от знака - в коде, поэтому вы можете написать его так, чтобы синтаксический анализатор не жаловался:

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

или

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

или

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

В этих случаях парсер PHP не запускается вокруг места в необработанном коде, в котором у него есть проблема для более синтаксического анализа.


Интересно, где это задокументировано. Например, в документации SimpleXML:

Доступ к элементам в документе XML, который содержит символы, не разрешенные в соответствии с соглашением об именах PHP (например, дефис), может быть выполнен путем инкапсуляции имени элемента в фигурные скобки и апострофа.

Пример # 3 Получение <line>

<?php
include 'example.php';

$movies = new SimpleXMLElement($xmlstr);

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

Вышеприведенный пример выводит:

PHP solves all my web problems