我在谷歌上搜索并阅读手册,但无法找到答案。
即,有一个像这样的字符串数组:
$a = ['book->name', 'book->id'];
现在我需要从shelf
对象中获取这些值。 Normaly我只想问:
$bookName = $shelf->book->name;
$bookId = $shelf->book->id;
但是我怎么读第二部分呢?
如果我尝试$shelf->{$a[0]}
,我会Undefined property: stdClass::$book->name in...
。
解决这个问题的方法是什么?
PS:我知道我可以尝试使用eval,但我真的不愿意。
答案 0 :(得分:1)
您可以通过拆分字符串来完成此操作:
$a = ['book->name', 'book->id'];
$parts = explode('->', $a[0]);
$bookName = $shelf->{$parts[0]}->{$parts[1]};
$parts = explode('->', $a[1]);
$bookId = $shelf->{$parts[0]}->{$parts[1]};
这假设您知道属性的嵌套程度。我可能会将其包装在一个函数中,以便能够处理未知数量的属性:
function getPropertyByString($object, $properties) {
$parts = explode('->', $properties);
$value = $object;
foreach ($parts as $part) {
if (!property_exists($value, $part)) {
throw new OutOfBoundsException('Object does not contain a property called "' . $part . '"');
}
$value = $value->$part;
}
return $value;
}
$bookName = getPropertyByString($shelf, $a[0]);
$bookId = getPropertyByString($shelf, $a[1]);