Ссылаясь на этот вопрос …
Как мне получить доступ к этому свойству объекта с дефисом?
… У меня есть еще один:
Я хочу получить доступ к свойству json, которое сохраняется в переменной … что-то вроде …
$var = '$obj->my-prop';
ЕСЛИ это было бы просто
$var = 'my-prop'
… Я мог бы решить проблему с дефисом, назвав его через
$obj->{$var}
что привело бы к
$obj->{'my-prop'}
… как сказано в предыдущем вопросе.
НО: Моя переменная также содержит предыдущее значение объекта (‘$ obj’). Поскольку его вызов через {$ var} приводит к {‘$ obj-> my-prop’}, что недопустимо, единственный способ решить его — это взорвать (‘->’, $ var) и затем объединить его , который беспорядок.
Кто-нибудь знает «решение idéale»? 🙂
РЕДАКТИРОВАТЬ:
поэтому решение idéale of one должно решить вопрос о том, сохранять ли этот синтаксис литерального объекта, сохраняя переменную как строку, которая выглядит (!) как объект. поэтому функция unpackPath в h2ooooooo будет правильной.
В отличие от этого, сохранение этой переменной в цепочке в виде массива (как сказал ToBe) откроет более подходящий для системы способ обработки данных. Json_decode строка типа ‘a-> b’ не возможна.
Вы должны сделать свой собственный парсер (используя eg. explode()
как вы упомянули).
<?php
class Foo {
public $bar;
public function __construct() {
$this->bar = new Bar();
}
}
class Bar {
public $oof;
public function __construct() {
$this->oof = new Oof();
}
}
class Oof {
public $id = 123;
}
function unpackPath($object, $path) {
if (is_string($path)) {
$path = explode('->', $path);
}
$value = $object->{$path[0]};
if (count($path) == 1) {
return $value;
} else {
return unpackPath($value, array_slice($path, 1));
}
}
$foo = new Foo();
var_dump( unpackPath($foo, 'bar->oof->id') ); // int(123)
DEMO.
Обратите внимание, что вы должны определить свой начальный объект ($foo
) чтобы не использовать глобальные переменные.
Других решений пока нет …