Php 从字符串变量获取对象值

Php 从字符串变量获取对象值,php,Php,我在谷歌上搜索并阅读手册,但找不到答案 即,具有如下字符串数组: $a = ['book->name', 'book->id']; 现在我需要从shelf对象中获取这些值。通常我会问: $bookName = $shelf->book->name; $bookId = $shelf->book->id; 但是第二部分是一根弦,我怎么读呢 如果我尝试$shelf->{$a[0]}我会得到未定义的属性:stdClass::$book->name in… 解决这

我在谷歌上搜索并阅读手册,但找不到答案

即,具有如下字符串数组:

$a = ['book->name', 'book->id'];
现在我需要从
shelf
对象中获取这些值。通常我会问:

$bookName = $shelf->book->name;
$bookId = $shelf->book->id;
但是第二部分是一根弦,我怎么读呢

如果我尝试
$shelf->{$a[0]}
我会得到
未定义的属性:stdClass::$book->name in…

解决这个问题的方法是什么


PS:我知道我可以尝试eval,但我真的不想尝试。

您可以通过拆分字符串来实现这一点:

$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]);

不,你不能这样做。另外,您的对象正在泄漏封装。您是否尝试过$shelf->$a[0]也许这会奏效谢谢,这是我在
eval
之后的第二个选择,我也这样做了。我想可能会有一条单行线。