我有一个简单的函数,当属性不存在时不会得到任何警告:
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"的属性。
有没有一种方法可以调整这个函数,使它可以任意深入到对象中?
您可以通过->
分解参数并对其进行迭代。尝试以下解决方案:
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