2010-03-10 3 views

ответ

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; 
    } 
} 
1
foreach($arr as $key => $val) 
{ 
    this->$key = $val; 
}; 
0
class MyClass { 
    private $a; 
    private $b; 

    public function __construct(array $arr) { 
     $this->a = $arr['a']; 
     $this->b = $arr['b']; 
    } 
} 
2

ответ Ignacio Vazquez-Абрамса это хорошо, но я бы предпочел белый список атрибутов, вы хотели бы, чтобы быть установлен таким образом:

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.

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, например. когда вы не хотите, чтобы класс вел себя как массив.

Смежные вопросы