PHP passage de paramètres lors de la création de nouveaux objets, call_user_func_array pour les objets
Je voudrais créer dynamiquement un objet PHP, et des paramètres facultatifs.
Par exemple, au lieu de faire ceci:
$test = new Obj($param);
Je voudrais faire quelque chose comme ceci (créer de nouveaux ob est une fiction):
$test = create_new_obj('Obj', $param);
Est-il de cette fonction en php? Quelque chose de semblable à call_user_func_array, mais pour un objet.
- pour préciser un peu plus, le nom de la classe est variable (ça change), et $param dépend de la classe qui en est chargé. Parfois il n'y a pas de param. Il s'agit essentiellement de les charger dynamiquement à partir d'une variété de classes en fonction de la situation.
- Je pense que ma réponse ci-dessous correspond toujours à la facture de ce que vous décrivez (variable noms de classe, en option paramètres de construction). Il n'y a aucune raison que vous ne pouvez pas passer null
$param
à un constructeur pour une classe qui n'en a pas besoin. Si, d'autre part, vous dites que le type de l'objet qui est créé est en fait la personne à charge sur$param
, alors vous aurez envie de regarder dans quelque chose comme le Modèle de Fabrique: en.wikipedia.org/wiki/Factory_method_pattern. PHP ne peut pas gérer vos décisions de construction pour vous dans ce cas... vous aurez besoin d'écrire logique pour décider de ce qui est construit.
Vous devez vous connecter pour publier un commentaire.
De PHP 5.6, vous pouvez désormais le faire avec une seule ligne de code à l'aide de l'Argument nouveau Déballage de l'opérateur (...).
Voici un exemple simple.
Voir Variable PHP-longueur des listes d'arguments pour plus d'informations.
$db = (new ReflectionClass ( 'Foo' ))->newInstanceArgs ( $args );
Puisque certains constructeurs peuvent prendre un nombre variable d'arguments, la méthode suivante doit être utilisée pour les accueillir.
Par exemple, si votre
Car
constructeur a pris 3 argsPuis
http://php.net/manual/en/class.reflectionclass.php
http://php.net/manual/en/reflectionclass.newinstanceargs.php
func_get_args()
pour cela.Dans de tels cas, j'utilise usine méthodes. ils peuvent être facilement définis dans les classes abstraites:
avec cela, vous pouvez utiliser
call_user_func_array()
:Vous pouvez créer dynamiquement un objet aussi longtemps que vous savez le nom de la classe:
Vous pouvez facilement définir une
__construct()
fonction de prendre les arguments par défaut ainsi si c'était une condition de la construction de la logique.[Modifier note]: C'est un concept connu sous le nom les variables, et il y a quelques exemples dans le manuel où l' nouveau commande est introduit.
Ici est une version épurée de ce que tu voulais:
Normal laid méthode de création d'une nouvelle instance de l'objet à l'aide de nouvelles
Appel statique à l'aide d'init à la place de la nouvelle
Statique appel à l'aide de initArray à la place de la nouvelle
Basé sur @chris' réponse( https://stackoverflow.com/a/2550465/1806628 ), voici une utilisation de la réflexion classes:
C'est utile, si vous voulez faire un objet de la fonction de copie dans une classe ancêtre et ne sais pas, si les enfants des classes de besoin de paramètres dans l'avenir, ou pas.