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

时间:2017-12-28 13:40:28

标签: php

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

即,有一个像这样的字符串数组:

$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,但我真的不愿意。

1 个答案:

答案 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]);