Je dois pouvoir appeler une fonction, mais le nom de la fonction est stocké dans une variable, est-ce possible? par exemple:
fonction foo () { // code ici } barre de fonction () { // code ici } $ functionName = "foo"; // j'ai besoin d'appeler la fonction en fonction de ce qui est $ functionName
php
dynamic-function
Lézard
la source
la source
is_callable
fonction. Il vérifiera si une variable contient quelque chose qui peut être appelé en tant que fonction (que ce soit le nom d'une fonction, un tableau contenant une instance d'objet et un nom de fonction, ou une fonction / fermeture anonyme)call_user_func(array('ClassName', 'method'), $args)
Ma version préférée est la version en ligne:
Vous pouvez également placer des variables ou des expressions entre crochets!
la source
{"functionName"}();
n'est pas légale et générera une erreur de syntaxe.Oui c'est possible:
Source: http://www.onlamp.com/pub/a/php/2001/05/17/php_foundations.html?page=2
la source
Comme déjà mentionné, il existe plusieurs façons d'y parvenir, la méthode la plus sûre étant peut-être
call_user_func()
ou si vous le devez, vous pouvez également suivre la voie$function_name()
. Il est possible de passer des arguments en utilisant ces deux méthodesSi la fonction que vous appelez appartient à un objet, vous pouvez toujours utiliser
Cependant, si vous allez utiliser la
$function_name()
méthode, il peut être judicieux de tester l'existence de la fonction si le nom est en quelque sorte dynamiquela source
Dans le cas où quelqu'un d'autre est amené ici par Google parce qu'il essayait d'utiliser une variable pour une méthode dans une classe, ce qui suit est un exemple de code qui fonctionnera réellement. Rien de ce qui précède n'a fonctionné pour ma situation. La principale différence réside
&
dans la déclaration$c = & new...
et la&$c
transmissioncall_user_func
.Mon cas spécifique est celui de l'implémentation du code de quelqu'un concernant les couleurs et les deux méthodes membres
lighten()
etdarken()
de la classe csscolor.php. Pour une raison quelconque, je voulais que le même code puisse appeler éclaircir ou assombrir plutôt que de le sélectionner avec logique. Cela peut être le résultat de mon entêtement à ne pas simplement utiliser if-else ou à changer le code appelant cette méthode.Notez qu'essayer quoi que ce soit avec
$c->{...}
n'a pas fonctionné. En parcourant le contenu fourni par le lecteur au bas de la page de php.netcall_user_func
, j'ai pu reconstituer ce qui précède. Notez$params
également qu'un tableau ne fonctionnait pas pour moi:Cette tentative ci-dessus donnerait un avertissement sur la méthode qui attend un deuxième argument (pourcentage).
la source
Quelques années de retard, mais c'est la meilleure manière maintenant à mon humble avis:
la source
Par souci d'exhaustivité, vous pouvez également utiliser eval () :
Cependant,
call_user_func()
c'est la bonne façon.la source
eval
n'est pas une solution à cette question.Solution: utilisez PHP7
Remarque: Pour une version résumée, voir TL; DR à la fin de la réponse.
Anciennes méthodes
Mise à jour : l'une des anciennes méthodes expliquées ici a été supprimée. Reportez-vous à d'autres réponses pour obtenir des explications sur d'autres méthodes, elles ne sont pas traitées ici. Soit dit en passant, si cette réponse ne vous aide pas, vous devriez retourner la mise à niveau de votre contenu. Le support de PHP 5.6 a pris fin en janvier 2019 (désormais même PHP 7.0 et 7.1 ne sont plus pris en charge). Voir les versions prises en charge pour plus d'informations.
Comme d'autres l'ont mentionné, en PHP5 (et également dans les versions plus récentes comme PHP7), nous pourrions utiliser des variables comme noms de fonction, utiliser
call_user_func()
etcall_user_func_array()
(qui, personnellement, je déteste ces fonctions), etc.De nouvelles méthodes
Depuis PHP7, de nouvelles méthodes ont été introduites:
Remarque: tout ce qui se trouve
<something>
entre crochets signifie une ou plusieurs expressions pour former quelque chose, par exemple<function_name>
, des expressions formant un nom de fonction.Appel de fonction dynamique: nom de la fonction à la volée
Nous pouvons utiliser une ou plusieurs expressions entre parenthèses comme nom de fonction en une seule fois, sous la forme de:
Par exemple:
Remarque: Bien que la suppression des parenthèses autour
str_replace()
ne soit pas une erreur, la mise en parenthèses rend le code plus lisible. Cependant, vous ne pouvez pas le faire parfois, par exemple lorsque vous utilisez l'.
opérateur. Pour être cohérent, je vous recommande de toujours mettre les parenthèses.Appel de méthode dynamique: nom de méthode à la volée
Tout comme les appels de fonction dynamiques, nous pouvons faire de même avec les appels de méthode, entourés d'accolades au lieu de parenthèses (pour les formulaires supplémentaires, accédez à TL; section DR):
Voyez-le dans un exemple:
Appel de méthode dynamique: la syntaxe du tableau
Une manière plus élégante ajoutée en PHP7 est la suivante:
Par exemple:
Remarque: L'avantage d'utiliser cette méthode par rapport à la précédente est que vous ne vous souciez pas du type d'appel (c'est-à-dire qu'il soit statique ou non).
Exemple supplémentaire: utilisation de classes anonymes
Pour compliquer les choses, vous pouvez utiliser une combinaison de classes anonymes et des fonctionnalités ci-dessus:
TL; DR (Conclusion)
Généralement, en PHP7, l'utilisation des formes suivantes est possible:
Basé principalement sur cette conversation PHP .
la source
(expressions)->$bar()
Noms et espaces de noms dynamiques
Juste pour ajouter un point sur les noms de fonctions dynamiques lors de l'utilisation d'espaces de noms.
Si vous utilisez des espaces de noms, les éléments suivants ne fonctionneront que si votre fonction se trouve dans l'espace de noms global:
Que faire?
Vous devez utiliser à la
call_user_func()
place:la source
Complétant la réponse de @Chris K si vous voulez appeler la méthode d'un objet, vous pouvez l'appeler en utilisant une seule variable à l'aide d'une fermeture:
J'ai posté un autre exemple ici
la source
Ce que j'ai appris de cette question et des réponses. Merci a tous!
Disons que j'ai ces variables et fonctions:
Pour appeler une fonction sans arguments
Pour appeler une fonction avec 1 argument
Pour appeler une fonction avec 1 ou plusieurs arguments Cela sera utile si vous appelez dynamiquement vos fonctions et que chaque fonction a un nombre d'arguments différent. C'est mon cas que j'ai recherché (et résolu).
call_user_func_array
C'est la cléAu revoir!
la source
Utilisez la fonction call_user_func.
la source
Le code suivant peut aider à écrire une fonction dynamique en PHP. maintenant le nom de la fonction peut être changé dynamiquement par la variable '$ current_page'.
la source
$function
variable sans aucune raison.La façon la plus simple d'appeler une fonction en toute sécurité en utilisant le nom stocké dans une variable est,
J'ai utilisé comme ci-dessous pour créer dynamiquement des tables de migration dans Laravel,
la source
Une approche non conventionnelle qui m'est venue à l'esprit est que, sauf si vous générez tout le code via une IA super ultra autonome qui s'auto-écrit , il y a de fortes chances que les fonctions que vous souhaitez appeler "dynamiquement" soient déjà définies dans votre code base. Alors pourquoi ne pas simplement vérifier la corde et faire la tristement célèbre
ifelse
danse pour invoquer le ... vous obtenez mon point.par exemple.
Même
switch-case
peut être utilisé si vous n'aimez pas le goût fade de l'ifelse
échelle.Je comprends qu'il y a des cas où " appeler dynamiquement la fonction " serait une nécessité absolue ( comme une logique récursive qui se modifie ). Mais la plupart des cas d'utilisation triviaux quotidiens peuvent simplement être évités.
Il élimine beaucoup d'incertitude de votre application, tout en vous donnant la possibilité d'exécuter une fonction de secours si la chaîne ne correspond à aucune des définitions des fonctions disponibles. A MON HUMBLE AVIS.
la source
if (method_exists($functionName)) $functionName(); else //exception or handle
Je ne sais pas pourquoi vous devez utiliser cela, cela ne me semble pas si bon du tout, mais s'il n'y a qu'une petite quantité de fonctions, vous pouvez utiliser une construction if / elseif. Je ne sais pas si une solution directe est possible.
quelque chose comme $ foo = "bar"; $ test = "foo"; test d'écho $$;
devrait retourner la barre, vous pouvez essayer, mais je ne pense pas que cela fonctionnera pour les fonctions
la source