2011-09-02 50 views
1

是否有可能具有这样的构造。说我有一个这样的数组:使用数组键将属性添加到对象

$names = array ('name1', 'name2', 'name3'); 
$values = array ('value1', 'value2', 'value3'); 

然后,我要做到以下几点:

foreach ($names as $field) { 
    $this->$field = $values[$counter]; 
    $counter ++; 
} 

这样,以后,我可以访问上述目标是这样的:

$var1 = $object->name1; 
$var2 = $object->name2; 

// produces "value1" 
echo $var1; 

// produces "value2" 
echo $var2; 

我想要做的是拥有一个动态命名字段的对象。 OO PHP有可能吗?

+1

是的。你没有尝试过吗?虽然上面的代码不会起作用,因为你需要执行'foreach($ names = $ k => $ name)$ this - > $ name = $ values [$ k];' – DaveRandom

+0

@DaveRandom:代码与'$ counter '。不是我会去的方式,但结果是一样的。 – webbiedave

+1

我认为这个问题已经在这里解答:http://stackoverflow.com/questions/829823/can-you-create-class-properties-dynamically-in-php – Sam

回答

3

是的,你可以

$object = (object)array_combine($names , $values); 

至于建议由@Sam的Magic __set method工作得更好

+0

谢谢!这是一个很好的解决方案:) – Shade

4

是的,这会工作,但一般变量变量都望而却步。

也许更优雅的解决办法是使用__get magic method的类像这样:然后

class Person 
{ 
    public function __construct($vars) 
    { 
     $this->vars = $vars; 
    } 

    public function __get($var) 
    { 
     if (isset($this->vars[$var])) { 
      return $this->vars[$var]; 
     } 

     return null; 
    } 
} 

的瓦尔阵列将工作像这样:

$vars = array(
    'name1' => 'value1', 
    'name2' => 'value2', 
    'name3' => 'value3', 
); 

$object = new Person($vars); 

或者,如果你特别希望从两个阵列构建它:

$vars = array_combine($names, $values) 
1

使用特殊配置您可以使用以下语法访问成员:

$object = new ArrayObject(array_combine($names, $values), ArrayObject::ARRAY_AS_PROPS); 

echo $object->name1; // value1 
echo $object['name1']; // value1