Мои начальные поиски не дали много результатов, однако, после обдумывания более широкого круга поисковых терминов, я нашел другие вопросы по SO, которые касались подобных проблем. Я придумал три решения. Все будет работать, но не все будут работать для всех.
Решение 1 - Цикл
Будет работать подход, аналогичный вопросу, на который ссылается мой исходный вопрос, или цикл, предложенный @ miken32.
Решение 2 - анонимная функция
Строка может быть взорвана в массив. Затем массив может быть проанализирован с помощью array_reduce () для получения результата. В моем случае рабочий код (с проверкой неправильных / несуществующих имен / написаний свойств) был таким (PHP 7+):
//create object - this comes from and external API in my case, but I'll include it here
//so that others can copy and paste for testing purposes
$obj = (object)[
'parent' => (object)[
'requestdata' => (object)[
'inputs' => (object)[
'firstname' => 'Travis'
]
]
]
];
//string representing the property we want to get on the object
$property = 'parent->requestdata->inputs->firstname';
$name = array_reduce(explode('->', $property), function ($previous, $current) {
return is_numeric($current) ? ($previous[$current] ?? null) : ($previous->$current ?? null); }, $obj);
var_dump($name); //outputs Travis
см. этот вопрос для получения потенциально важной информации и кода, на котором я основал свой ответ.
Решение 3 - компонент доступа к свойствам Symfony
В моем случае было легко использовать composer, чтобы требовать этот компонент. Это позволяет получить доступ к свойствам массивов и объектов, используя простые строки. Вы можете прочитать о том, как его использовать на сайте Symfony. Основным преимуществом для меня по сравнению с другими вариантами была включенная проверка ошибок.
Мой код в итоге выглядел так:
//create object - this comes from and external API in my case, but I'll include it here
//so that others can copy and paste for testing purposes
//don't forget to include the component at the top of your class
//'use Symfony\Component\PropertyAccess\PropertyAccess;'
$obj = (object)[
'parent' => (object)[
'requestdata' => (object)[
'inputs' => (object)[
'firstname' => 'Travis'
]
]
]
];
//string representing the property we want to get on the object
//NOTE: syfony uses dot notation. I could not get standard '->' object notation to work.
$property = 'parent.requestdata.inputs.firstname';
//create symfony property access factory
$propertyAccessor = PropertyAccess::createPropertyAccessor();
//get the desired value
$name = $propertyAccessor->getValue($obj, $property);
var_dump($name); //outputs 'Travis'
Все три варианта будут работать. Выберите тот, который работает для вас.