$path = explode('->', $path);
foreach ($path as $step) {
$object = $object->$step ?? null;
}
return $object;
$object = new Object; // Инициализация объекта, который содержит property «a»
$path = 'a->b->c';
$properties = explode('->', $path);
$getProperty = function($obj, $property) {
// Тут какие-нибудь проверки на существование, на instanceof и т. п.
return $obj->$property;
};
$result = array_reduce($properties, $getProperty, $object);
// $result -- это последний property в цепочке, т.е. -- «c»
$xml = new SimpleXMLElement('<xml><a><b><c>test</c></b></a></xml>');
$result = $xml->xpath('//a/b/c');
function getPropertyByPath($object, $path) {
$path = explode('->', $path);
foreach ($path as $step) {
if (is_object($object) && property_exists($object, $step)) {
$object = $object->$step;
} else {
return null;
}
}
return $object;
}
var_dump($object);
$path = 'a->b->c';
var_dump(getPropertyByPath($object, $path));
class stdClass#1 (1) {
public $a =>
class stdClass#2 (1) {
public $b =>
class stdClass#3 (1) {
public $c =>
string(5) "12345"
}
}
}
string(5) "12345"
$object = new \stdClass();
$a = new \stdClass();
$a->name = 'a';
$b = new \stdClass();
$b->name = 'b';
$c = new \stdClass();
$c->name = 'c';
$object->a = $a;
$a->b = $b;
$b->c = $c;
$path = 'a.b.c';
$propertyAccessor = \Symfony\Component\PropertyAccess\PropertyAccess::createPropertyAccessor();
var_dump($propertyAccessor->getValue($object, $path));