2014-01-24 7 views
8

У меня есть функция, которая должна читать массив и динамически устанавливать свойства объекта.PHP задает свойства объекта динамически

class A { 
    public $a; 
    public $b; 

    function set($array){ 
     foreach ($array as $key => $value){ 
      if (property_exists ($this , $key)){ 
       $this->{$key} = $value; 
      } 
     } 
    } 
} 

$a = new A(); 
$val = Array("a" => "this should be set to property", "b" => "and this also"); 
$a->set($val); 

Ну, очевидно, что это не работает, есть ли способ сделать это?

EDIT

Кажется, что нет ничего плохого в этом коде, этот вопрос должен быть закрыт

+2

Удалить скобки {} и будет работать! -> '$ this -> $ key = $ value;' –

+0

Ну, это очевидно работает ..., просто протестировано на php 5.4 – Dysosmus

+0

Хорошо, благослови мою бороду! – Benedictus

ответ

8

http://www.php.net/manual/en/reflectionproperty.setvalue.php

Вы можете с помощью Reflection, я думаю.

<?php 

function set(array $array) { 
    $refl = new ReflectionClass($this); 

    foreach ($array as $propertyToSet => $value) { 
    $property = $refl->getProperty($propertyToSet); 

    if ($property instanceof ReflectionProperty) { 
     $property->setValue($this, $value); 
    } 
    } 
} 

$a = new A(); 

$a->set(
    array(
    'a' => 'foo', 
    'b' => 'bar' 
) 
); 

var_dump($a); 

Выходы:

object(A)[1] 
    public 'a' => string 'foo' (length=3) 
    public 'b' => string 'bar' (length=3) 
+0

вы можете, но зачем использовать его, если простой сеттер будет делать – eis

+0

Ответил, потому что отправил что-то полезное – Benedictus

20

Вам только нужно удалить скобки {} и будет работать! ->$this->$key = $value;

Смежные вопросы