PHP通过数组中的字符串访问嵌套对象属性
假设我们有一个对象$obj。此对象具有如下属性:PHP通过数组中的字符串访问嵌套对象属性,php,oop,properties,Php,Oop,Properties,假设我们有一个对象$obj。此对象具有如下属性: $obj->p1->p2->p3 = 'foo'; 现在我在数组中得到嵌套的属性结构: $arr = array( 'p1', 'p2', 'p3' ); 目前,我使用以下功能访问相应的属性: function getProperty( $obj, $property ) { foreach( $property as $p ) { $obj = $obj->{$p}; } return $obj; } $v
$obj->p1->p2->p3 = 'foo';
现在我在数组中得到嵌套的属性结构:
$arr = array( 'p1', 'p2', 'p3' );
目前,我使用以下功能访问相应的属性:
function getProperty( $obj, $property ) {
foreach( $property as $p ) {
$obj = $obj->{$p};
}
return $obj;
}
$value = getProperty( $obj, $arr); // = 'foo'
有没有更聪明的方法(不,“eval”不是一个选项!;)?如果你想用一行或更漂亮一点的话,你可以尝试以下方法:
echo json_decode(json_encode($obj), true)['p1']['p2']['p3']; // PHP 5.4
或对于PHP5.3:
$arr = json_decode(json_encode($obj), true);
echo $arr['p1']['p2']['p3'];
这就是你想要实现的目标吗?如果它有效,你为什么要改进它。没有迫切需要改变它。但它似乎有点复杂,也不是很优雅。此外,这是一个非常复杂的脚本的一部分,执行时间是这里的一个相关点……我不认为你可以让它“更漂亮”。这里是使用数组_reduce替代foreach的方法。函数getProperty($object,array$keys){return array_reduce($keys,函数($carry,$item){return$carry->{$item};},$object);}谢谢!我越想,就越觉得没有“更漂亮”的方法现在看起来不错但是对象可以非常大,具有许多属性。必须检查json编码和解码的执行时间。