如何从Array填充PHP中的对象

时间:2012-03-06 15:31:46

标签: php

假设我有:

class A{
 public $one;
 public $two;
}

和一个值为:

的数组
array('one' => 234, 'two' => 2)

有没有办法让A的实例自动填充数组中的正确值?

4 个答案:

答案 0 :(得分:15)

你需要为自己写一个函数。 PHP有get_object_varsDocs但没有设置对应物:

function set_object_vars($object, array $vars) {
    $has = get_object_vars($object);
    foreach ($has as $name => $oldValue) {
        $object->$name = isset($vars[$name]) ? $vars[$name] : NULL;
    }
}

用法:

$a = new A();
$vars = array('one' => 234, 'two' => 2);
set_object_vars($a, $vars);

答案 1 :(得分:2)

如果要允许批量设置属性,还可以将它们存储为属性。它允许您更好地封装在类中。

class A{
  protected $attributes = array();
  function setAttributes($attributes){
    $this->attributes = $attributes;
  }

  public function __get($key){
    return $this->attributes[$key];
  }

}

答案 2 :(得分:1)

@hakre版本相当不错,但很危险(假设 id 或密码在道具中)。

我会将默认行为更改为:

function set_object_vars($object, array $vars) {
    $has = get_object_vars($object);
    foreach ($has as $name => $oldValue) {        
        array_key_exists($vars[$name]) ?  $object->$name =$vars[$name] : NULL;
    }
}

此处,不在$ vars数组中的先前属性不受影响 如果你想把道具设置为有目的,你可以。

答案 3 :(得分:-1)

是的。

可以使用pass thru方法。

例如:

class A {
    public $one, $tow;
    function __construct($values) {
        $this->one = $values['one'] ?: null;
        $this->two = $values['two'] ?: null;
    }
}

$a = new A(array('one' => 234, 'two' => 2));