在对象属性中运行循环并分配值

时间:2014-10-23 12:27:55

标签: php arrays class loops variable-assignment

我有这门课,

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类的公共属性。

3 个答案:

答案 0 :(得分:2)

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

这是一种稍微好一点的方式,它更聪明 - 因为你的代码更少,工作量更少,你可以根据需要添加任意数量的属性而无需接触类。

代码:

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(),您可以利用它们来编写类(使用适当的数据和值检查),使其可以使用而无需声明其属性。这降低了复杂性。或者,如果它们以令人满意的方式适合您的场景,您可以使用给定答案之一。

答案 1 :(得分:1)

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

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

更改为单个$

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

<强> Codepad demo

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

也就是说,解决问题的方法可能比这更好。好像是X Y Problem

答案 2 :(得分:1)

你走了:

<?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,因为$$keyvariable variable