2010-12-11 2 views
1

En Python, vous pouvez emballer et déballer des arguments comme ceci:emballage Argument et le déballage lors de l'instanciation d'une nouvelle instance de classe en PHP

def myfunction(arg1, arg2, arg3): 
    pass 

mydict = dict(arg1='foo', arg2='bar', arg3='baz') 

myfunction(**mydict) 

mylist = ['foo', 'bar', 'baz'] 

myfunction(*mylist) 

Maintenant, est-il quelque chose de similaire en PHP? J'ai une classe qui est passée à une fonction, avec un tableau associatif extrait d'un enregistrement de base de données. Je veux créer une instance de la classe, qui accepte les arguments nommés comme les clés du tableau. Peut-il être fait?

EDIT

Ok, donc je ne doute pas formulé ma question correctement. Je voulais instancier dynamiquement une nouvelle classe quand je ne connaissais ni le nom de la classe, ni le nombre d'arguments à l'avance.

J'ai trouvé la réponse que:

http://php.net/manual/en/book.reflection.php

Voici la solution:

class MyClass { 
    public function __construct($var1, $var2, $var3) { 
     echo "$var1\n"; 
     echo "$var2\n"; 
     echo "$var3\n"; 
    } 
} 

$reflector = new ReflectionClass('MyClass'); 
$args = array('var1'=>'foo', 'var2'=>'baz', 'var3'=>'bar'); 
$instance = $reflector->newInstanceArgs($args); 

Répondre

2

Non vous ne pouvez pas le faire directement, vous devrez extraire manuellement les valeurs à partir du tableau et passez-les au constructeur, ou modifiez-le pour qu'il accepte un tableau en tant qu'argument.

Vous pouvez jeter un oeil à call_user_func_array mais je ne pense pas que vous pouvez l'utiliser avec un constructeur car vous avez besoin d'une instance de l'objet pour appeler l'une de ses méthodes.

+0

C'est ce que j'ai fait par le passé. Passez simplement un tableau à la fonction (tant que la fonction est autorisée) – Matthew

1

Notez que la liste de déballage myfunc(*args) param peut être réalisé avec call_user_func_array():

$args = array("foo", "bar", "baz"); 

call_user_func_array("myfunc", $args); 

Pour les méthodes d'objet, vous pouvez utiliser call_user_func_array(array($obj, "__construct"), $args). La déficience ici est le __constructeur donc serait invoqué deux fois, donc ne devrait pas faire des choses drôles. Sinon, une méthode init spécifique est nécessaire.

En raison du manque de paramètres nommés, un équivalent à myfunc(**args) n'existe pas en PHP. Un idiome commun est donc juste de passer le dict/array et de laisser la fonction gérer les params nommés.

+0

Dans les commentaires de call_user_func_array(), il existe de très bonnes alternatives pour faire cela sur les fonctions et pas seulement sur la classe, comme le commentaire de Damin. – gaborous

Questions connexes