使用数组键向对象添加属性

时间:2011-09-02 15:47:18

标签: php oop

是否有可能有这样的结构。假设我有一个这样的数组:

$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吗?

3 个答案:

答案 0 :(得分: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数组将如此工作:

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

$object = new Person($vars);

或者,如果您特别想要从两个数组构建它:

$vars = array_combine($names, $values)

答案 1 :(得分:3)

是的,你可以

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

根据@Sam的建议,Magic __set method效果更好

答案 2 :(得分:1)

使用特殊配置的ArrayObject,您可以使用以下任一语法访问成员:

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

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