2010-03-10 31 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

伊格纳西奥巴斯克斯 - 艾布拉姆斯的回答是不错,但我更喜欢的属性的白名单,你想允许这样设置:

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

根据您的用例,这可能是给定的解决方案的替代,以及:

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,例如当你不想让这个类的行为像一个数组。

相关问题