PHP通过字符串变量访问更深层的对象属性

时间:2016-04-04 03:48:27

标签: php

我有这个简单的功能,当属性不存在时不会收到任何警告:

function getProperty($object, $property, $default = ""){
    if (is_object($object) && isset($object->$property)) return $object->$property;

    return $default;
}

这对于这样的事情很有用:

$o = new stdClass();
$o->name = "Peter";

$name = getProperty($o, 'name', 'No name');
$email = getProperty($o, 'email', 'No email');

这将返回$name = 'Peter'$email = 'No email'

现在我想为以下对象做同样的事情:

$o = new stdClass();
$o->wife = new stdClass();
$o->wife->name = "Olga";

getProperty($o, "wife->name", "No name");

这不起作用,因为该函数现在将尝试获取名称为“wife-> name”的属性,该属性不存在。

有没有办法可以调整这个功能,以便它可以任意深入到对象中?

1 个答案:

答案 0 :(得分:1)

你可以通过->爆炸参数并迭代它。尝试以下解决方案:

function getProperty($object, $property, $default = ""){

    $properties = explode('->', $property);

    if($properties){
        foreach($properties as $val){
            if(isset($object->$val)){
                $object = $object->$val;
            } else{
                break;
            }
        }
    }

    if (!is_object($object) && $object) return $object;

    return $default;
}

$o = new stdClass();
$o->name = "Peter";

echo $name = getProperty($o, 'name', 'No name'); //output: Peter
echo $email = getProperty($o, 'email', 'No email'); //output: No email

$o = new stdClass();
$o->wife = new stdClass();
$o->wife->name = "Olga";

echo getProperty($o, "wife->name", "No name"); //output: Olga