我应该怎么样才能做到这一点?如何将传递给对象的构造函数的数组转换为对象的属性?
$data = array(
'a' => 12345,
'b' => 67890,
);
$object = new Class($data);
echo $object->a; //outputs 12345
echo $object->b; //outputs 67890
我应该怎么样才能做到这一点?如何将传递给对象的构造函数的数组转换为对象的属性?
$data = array(
'a' => 12345,
'b' => 67890,
);
$object = new Class($data);
echo $object->a; //outputs 12345
echo $object->b; //outputs 67890
class A {
private $data;
public function __get($key) {
return isset($this -> data[$key]) ? $this -> data[$key] : false;
}
public function __construct(array $data) {
$this -> data = $data;
}
}
foreach($arr as $key => $val)
{
this->$key = $val;
};
class MyClass {
private $a;
private $b;
public function __construct(array $arr) {
$this->a = $arr['a'];
$this->b = $arr['b'];
}
}
伊格纳西奥巴斯克斯 - 艾布拉姆斯的回答是不错,但我更喜欢的属性的白名单,你想允许这样设置:
foreach(array('attribute1', 'attribute2') as $attribute_name) {
if(array_key_exists($attribute_name, $data)) {
$this->$attribute_name = $data[$attribute_name];
}
}
这样你可以确保没有私人属性设置。
或者,如果你只是对象语法后的时候,你可以这样做:
$object = (object) $data;
$object = $data->a // = 12345
这是强迫的阵列为StdClass
。
根据您的用例,这可能是给定的解决方案的替代,以及:
class A extends ArrayObject {}
这种方式,阵列中的所有属性将通过对象符号和数组符号,例如访问
$a = new A(array('foo' => 'bar'), 2); // the 2 enables object notation
echo $a->foo;
echo $a['foo'];
你可以通过类的声明看,ArrayObject实现了许多,让您使用类像一个阵列接口:
Class [ <internal:SPL> <iterateable> class ArrayObject
implements IteratorAggregate, Traversable, ArrayAccess, Countable ]
它还增加了许多方法来完成数组访问能力。正如开头所述,这可能不适合您的UseCase,例如当你不想让这个类的行为像一个数组。