通过对象属性运行循环并赋值


Running a loop through object properties and assign value

我有这个类,

class example {
    public $a;
    public $b;
    public $c;
    ....
}

我有一个数组,包含与示例类中相同数量的公共变量(在本例中为3):

$arr[0] = 'Red';
$arr[1] = 'Green';
$arr[2] = 'Blue';

我想把这个数组的每个值一个接一个地分配给类的公共属性(比如$a得到Red$b得到Green等等)。如何使用循环将数组中的这些值分配给类的公共属性?

我写了下面这样的东西,但没有奏效:

$class = new example();
$i = 0;
foreach ($class as $key => $value) {
    $class->$$key = $arr[$i];
    $i++;
}

编辑:

只是为了解释为什么我不能在example类中使用任何setter/getter方法——实际上example类是通过取消数据库对象的序列化来创建的。我对这门课没有任何控制权。我正在处理一个控制器类,它接收这个example类和一个数组。我需要找到一种方法,将这个数组中的值分配给example类的公共属性。

当您分配密钥时,由于双$$,它不起作用:

$class->$$key = $arr[$i];

更改为单个$

$class->$key = $arr[$i];

Codepad演示

访问没有变量的对象属性时,不需要$,因此,如果密钥存储在变量中,则需要一个$

也就是说,可能有比这更好的方法来解决这个问题。似乎是XY问题。

好吧,正如我之前提到的,这种方法是错误的。有两个答案可以告诉你如何做,但这不是最好的方法。

这是一种稍微好一点的方法,而且它更聪明——因为你有更少的代码,更少的工作,而且你可以在不接触类的情况下添加任意多的属性。

代码:

class MyClass {
    protected $_data = array();
    public function setData(array $data)
    {
        $this->_data = $data;
    }
    public function __set($key, $value)
    {
        $this->_data[$key] = $value;
    }
    public function __get($key)
    {
        return isset($this->_data[$key]) ? $this->data[$key] : null;
    }
}

使用场景#1:

$class = new MyClass;
$class->red = 'My red value';
$class->blue = 'My blue value';

使用场景#2:

$class = new MyClass;
$class->setData( array('red' => 'Red', 'blue' => 'Blue', 'green' => 'Green') );

该示例引导您使用神奇的函数__get()和__set(),您可以使用它们来为自己的优势进行编码(使用适当的数据和值检查),使其可以在不必声明其属性的情况下使用。这降低了复杂性。或者,如果给定的答案符合您的场景,您可以使用其中一个答案。

开始:

<?php
class example {
    public $a;
    public $b;
    public $c;
}
$arr[0] = 'Red';
$arr[1] = 'Green';
$arr[2] = 'Blue';
$class = new example();
$i = 0;
foreach ($class as $key => $value) {
    $class->{$key} = $arr[$i];
    $i++;
}
var_dump($class);

基本思想是使用$class->{$key}而不是$class->$$key,因为$$key是一个可变变量。