Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/230.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP通过数组中的字符串访问嵌套对象属性_Php_Oop_Properties - Fatal编程技术网

PHP通过数组中的字符串访问嵌套对象属性

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。此对象具有如下属性:

$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编码和解码的执行时间。