将关联数组传递给对象并为数组中的每个元素调用setter

时间:2013-07-30 19:53:08

标签: php codeigniter object

我创建了一个实体类,我想通过将一个关联数组传递给它来构造它。 目标是最终将关联数组中的每个键添加到“set_”前面,以便为关联数组中的每个值调用适当的setter方法。

foreach($array AS $key => $value)
{
    if(is_string($value))
    {
        eval( '$this->set_'.$key.'(\''.$value.'\');' );
    }
    elseif(is_array($value))
    {
        eval( '$this->set_'.$key.'('.$value.');' );
    }
}

上面的代码适用于$ array中的元素,其中$ value是字符串或int,但它不适用于数组。

这种方法感觉很笨,有没有更好的方法呢?

提前致谢..

2 个答案:

答案 0 :(得分:3)

查看__set()魔法和call_user_func()。以下是如何以更优雅的方式完成的可能解决方案之一:

class Entity {

    private $foo;
    private $bar;

    public function __construct(Array $params) {
        foreach($params as $key => $value) {
            $method = 'set_' . $key;
            if(is_callable(array($this, $method))) {
                call_user_func(array($this, $method), $value);
            }
        }
    }

    public function set_Foo($value) {
        $this->foo = $value;
    }

    public function set_Bar($value) {
        $this->foo = $value;
    }

}

答案 1 :(得分:2)

Eval可能很危险,请参阅:http://www.php.net/manual/en/function.call-user-func-array.php

$Function = "set_$key";
call_user_func_array(array($this, $Function), array($Value));

$这是调用自己,因为这听起来像是在一个类中使用。

我会使用array_walk_recursive来解决这些问题。