我创建了一个实体类,我想通过将一个关联数组传递给它来构造它。 目标是最终将关联数组中的每个键添加到“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,但它不适用于数组。
这种方法感觉很笨,有没有更好的方法呢?
提前致谢..
答案 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来解决这些问题。