我应该在课堂上做什么才能这样做?
$data = array(
'a' => 12345,
'b' => 67890,
);
$object = new Class($data);
echo $object->a; //outputs 12345
echo $object->b; //outputs 67890
答案 0 :(得分:2)
Ignacio Vazquez-Abrams的答案很好,但我更喜欢你希望以这种方式设置的属性白名单:
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
。
答案 1 :(得分:1)
foreach($arr as $key => $val)
{
this->$key = $val;
};
答案 2 :(得分:1)
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;
}
}
答案 3 :(得分:0)
class MyClass {
private $a;
private $b;
public function __construct(array $arr) {
$this->a = $arr['a'];
$this->b = $arr['b'];
}
}
答案 4 :(得分:0)
根据您的UseCase,这可能是给定解决方案的替代方案:
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中可能并不理想,例如:当你不希望这个类表现得像一个数组时。