我有这门课,
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
类的公共属性。
答案 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
,因为$$key
是variable variable。