2010-09-27 116 views
2
$class = new Class; 
$foo = json_decode($_POST['array']); 

在这个非常人为的例子中,我有一个有自己的函数和变量的类,等等等等。在一个对象中添加一个类的变量

我也刚刚解码了一个JSON字符串,所以这些值现在在$foo。如何移动在$foo元素到$class,使:

$foo->name变得$class->name

如果我知道所有元素是什么,会是微不足道的,是的......除了为了充满活力,让我们说我希望他们全部转移过来,我不知道他们的名字。

+0

我只是在完全查看您的代码之前回答了这个问题......一定要标记您正在使用的语言/平台。 – 2010-09-27 19:16:51

回答

2

你可以使用get_object_vars

$vars = get_object_vars($foo); 
foreach ($vars as $key => $value) { 
    $class->$key = $value; 
} 

你也可以在你的类实现这个:

public function bindArray(array $data) { 
    foreach ($data as $key => $value) { 
     $this->$key = $value; 
    } 
} 

再投对象到一个数组:

$obj->bindArray((array) $foo); 

或增加一种方法也是这样做的:

public function bindObject($data) { 
    $this->bindArray((array) $data); 
} 
+0

干杯 - 做到了。谢谢你的帮助! – 2010-09-28 14:04:59

1

向类中添加一个函数以从对象中加载值,然后使用foreach遍历对象的属性并将它们添加到类中(在初始化它们之前,不需要声明类成员):

class Class 
{ 
    function load_values($arr) 
    { 
    foreach ($arr as $key => $value) 
    { 
     $this->$key = $value; 
    } 
    } 
} 

$class = new Class; 
$foo = json_decode($_POST['array']); 
$class->load_values((array)$foo); 
+0

噢,是的,当然... foreach也是$ key =>的值...干杯! – 2010-09-27 19:26:30

+0

那么,如果你没有声明它们,它们就会被公开......哦,直接迭代对象并不是一个好主意,因为它们可以实现['traversable'](http://us2.php.net /manual/en/class.traversable.php)接口(此时代码将无法按预期工作)。演员(你在代码中做的)是安全的... – ircmaxell 2010-09-27 19:26:36

+0

@ircmaxell tr​​ue他们将公开,但这是相当不可避免的,除非JSON对象总是包含相同的键,在这种情况下,他们可以预先声明。关于“可穿越”的公平观点,我没有意识到。 – 2010-09-27 19:45:46

相关问题