如何将传入对象构造函数的数组转换为对象的属性?

时间:2010-03-10 14:33:31

标签: php

我应该在课堂上做什么才能这样做?

$data = array(
 'a' => 12345,
 'b' => 67890,
);

$object = new Class($data);

echo $object->a; //outputs 12345
echo $object->b; //outputs 67890

5 个答案:

答案 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中可能并不理想,例如:当你不希望这个类表现得像一个数组时。