2010-05-11 39 views
0

我有一个很大的属性列表,我需要在两个对象之间进行映射,其中一个我需要映射的值被隐藏在数组中。我希望避免在代码中对属性名称进行硬编码。通过在PHP中的数组通过字符串访问属性?

如果我有这样一个类:

class Product { 
    public $colors, $sizes; 
} 

我可以访问属性是这样的:

$props = array('colors', 'sizes'); 
foreach ($props as $p) { 
    $this->$p = $other_object->$p; 
} 

至于我可以告诉大家,如果每个左侧的属性是一个数组,我不能这样做:

foreach ($props as $p) { 
    $this->$p[0]['value'] = $other_object->$p; 
} 

这是正确的,还是我错过了一些聪明的方法呢?

(这是在Drupal,但我真的不认为这事。)

回答

4

我相信你可以在大括号{}把它包:

foreach ($props as $p) { 
    $this->{$p}[0]['value'] = $other_object->$p; 
} 

编辑:

好。现在我的大脑开启了。对于令人困惑的编辑感到抱歉。

+0

这是动态设置对象属性 – 2010-05-11 23:18:12

-1

我不明白你的问题。这工作:

class Test { 
    public $prop = "prov value"; 
} 
$arr = array(array("prop")); 
$test = new Test(); 
$test->$arr[0][0] = "new prop value"; 
var_dump($test); 

结果:

object(Test)#1 (1) { 
    ["prop"]=> 
    string(14) "new prop value" 
}
+0

你的例子并没有做我所需要的。您将$ test-> prop设置为一个值;在我的情况下,$ test-> prop本身就是一个数组,我需要设置其中的一部分。上面的花括号工作。 – sprugman 2010-05-12 18:00:33

1

也试试这个:


$props = get_object_vars($this); 
+0

的合适技术,可以很好地解决问题。 – powtac 2010-05-11 23:28:37

0
foreach ($props as $p) { 
    $this->{$p}[0]['value'] = $other_object->{$p}; 
} 

这就是所谓的variable, variables

+1

第一次回头的'$ p'将会是''colors''。 '$$ p'会尝试访问'$ colors'作为属性名称,这在这里不是所希望的,因为'$ colors'不是一个已定义的变量。 在'$$ p'中删除多余的$',你很好。 – awgy 2010-05-11 23:35:51

+0

谢谢@awgy。那么信用就应该真正归功于你。 – 2010-05-12 00:45:46