假设我有:
class A{
public $one;
public $two;
}
和一个值为:
的数组array('one' => 234, 'two' => 2)
有没有办法让A的实例自动填充数组中的正确值?
答案 0 :(得分:15)
你需要为自己写一个函数。 PHP有get_object_vars
Docs但没有设置对应物:
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));