给定复杂的PHP对象层次结构,我是否可以确定表示属性路径的字符串是否存在?

时间:2018-07-23 20:07:18

标签: php properties

给出一个类似于“ person.addressHistory [2] .town”的字符串,我如何确定该字符串是否指向实际存在的属性。要使其有效;

  1. 我的对象具有一个person属性,其值是一个对象。
  2. person对象具有一个名为addressHistory的属性,其值是一个数组
  3. addressHistory数组必须具有键调用“ 2”
  4. 值是addressHistory [2]是具有名为Town的属性的对象

理想情况下,我想做类似if(property_exists($ myObject,'person.addressHistory [2] .town');

我考虑过在点上爆炸,然后尝试创建一个递归函数,该函数可以深入到对象层次结构中。

1 个答案:

答案 0 :(得分:2)

除点.外,此点应正确eval。因此,让我们替换它们:

$string = str_replace('.', '->', $string);
$result = eval("return isset(\$myObject->$string);");

您只能验证允许的字符:

if(!preg_match('/[^A-Z0-9\[\].]/i', $string)) {
    $string = str_replace('.', '->', $string);
    $result = eval("return isset(\$object->$string);");
} else {
    $result = false;
}

使用.表示法可以实现其他解决方案,但是使用该数组语法[n]可能会很长且混乱。