我有这个类,
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
是一个可变变量。