2016-12-24 1 views
1

j'ai une chaîne de classes suivantes:Définition des attributs récursive

class A extends Model { 
    public $first; 
    public $b; 
    public function __construct() { 
    $this -> b = new B(); 
    } 
} 

class B extends Model { 
    public $c; 
    public function __construct() { 
    $this -> c = new C(); 
    } 
} 

class C extends Model { 
    public $foo; 
} 

Et je veux écrire une fonction qui définira une valeur d'attribut en fonction de certains paramètres, par exemple, si je l'appellerai sur l'objet A et passer array('b_c_foo' => 'something') à elle, je veux $a -> b -> c -> foo = 'something' à définir.

Par exemple:

$a = new A(); 
$params = array(
    'first' => 'first', 
    'b_c_foo' => 'something' 
); 
$a -> fillAttributes($params); 
var_dump($a); // here A object should have first == 'fist', and b -> c -> foo == 'something' 

J'ai écrit une telle fonction pour la seule classe A, il est facile parce que je peux trouver les indices de tableau et le mettre à A classe comme $this -> {$index} = $value;, mais il est pas facile si le nombre d'appels est dynamique.

Comment est-ce que je pourrais faire ceci?

Répondre

1

Quelque chose comme

public function fillAttributes(array $params) 
{ 
    foreach ($params as $attributeName => $attributeValue) { 
     $rootObject = $this; 

     foreach(explode('_', $attributeName) as $proprietyName) { 
       if (property_exists($rootObject, $proprietyName)) { 
        if (is_object($rootObject->$proprietyName)) { 
         $rootObject = $rootObject->$proprietyName; 
        } 
       } 
     } 

     $rootObject->$proprietyName = $attributeValue; 
    } 
} 

Fondamentalement, vous explode la chaîne et vérifier si une propriété avec ce nom existe et ce n'est pas un objet. Seulement alors vous définissez la valeur.