递归设置属性

时间:2016-12-24 12:10:35

标签: php

我有以下几类课程:

A

我想编写一个基于某个参数设置属性值的函数,例如,如果我在对象array('b_c_foo' => 'something')上调用它并将$a -> b -> c -> foo = 'something'传递给它,我想要{{1要设置。

例如:

$a = new A();
$params = array(
    'first' => 'first',
    'b_c_foo' => 'something'
);
$a -> fillAttributes($params);
var_dump($a); // here A object should have first == 'fist', and b -> c -> foo == 'something'

我只为A类编写了这样的函数,这很简单,因为我可以找到数组索引并将其设置为A类,如$this -> {$index} = $value;,但这并不容易如果通话次数是动态的。

我怎么能这样做?

1 个答案:

答案 0 :(得分:1)

这样的东西
public function fillAttributes(array $params)
{
    foreach ($params as $attributeName => $attributeValue) {
        $rootObject = $this;

        foreach(explode('_', $attributeName) as $proprietyName) {
              if (property_exists($rootObject, $proprietyName)) {
                  if (is_object($rootObject->$proprietyName)) {
                      $rootObject = $rootObject->$proprietyName;
                  }
              }
        }

        $rootObject->$proprietyName = $attributeValue;
    }
}

基本上你explode字符串并检查是否存在具有该名称的适当性并且它不是对象。只有这样你才能设置值。