pourquoi devrait-on préférer call_user_func_array plus régulier de l'appel de la fonction?
function foobar($arg, $arg2) {
echo __FUNCTION__, " got $arg and $arg2\n";
}
foobar('one','two'); //OUTPUTS : foobar got one and two
call_user_func_array("foobar", array("one", "two")); ////OUTPUTS : foobar got one and two
Que je puisse voir à la fois régulière et call_user_func_array
méthode à la fois des résultats de même, alors pourquoi devrait-on le préfère?
Dans le scénario régulière méthode d'appel échouera mais call_user_func_array
ne va pas?
Puis-je obtenir un tel exemple?
Merci
call_user_func_array
est surtout utilisé dans des contextes dynamiques, lorsque vous ne savez pas quelle fonction vous permettra d'appeler et quels sont les arguments que vous allez passer à l'avance.- cant on de l'utilisateur méthode régulière pour tableau d'arguments ? @ elclanrs
- merci tout le monde !! j'ai appris quelque chose de nouveau aujourd'hui 🙂
Vous devez vous connecter pour publier un commentaire.
Vous avez un tableau avec les arguments d'une fonction qui est d'une durée indéterminée.
L'alternative serait de:
Qui n'est pas une solution.
Le cas d'utilisation de ce qui peut être rare, mais quand vous venez à travers elle, vous besoin il.
foobar(...$args);
foobar
fonction ?func_get_args()
pour le plaisir de la discussion.call_user_func_array
?call_user_func_array
fait, je suis la réponse à la question de ce que la situation que vous souhaitez utiliser et ce que l'alternative pourrait ressembler.call_user_func_array
besoin de la connaissance que pour le rôle qu'elle joue. Essayer de comprendre l'ensemble sait pas scénario.Si vous ne savez pas à l'avance combien d'arguments que vous allez passer à votre fonction, il serait conseillé d'utiliser
call_user_func_array()
; la seule alternative est uneswitch
déclaration ou un tas de conditions pour accomplir un sous-ensemble prédéfini de possibilités.Un autre scénario est celui où la fonction est appelée n'est pas connu à l'avance, par exemple
array($obj, 'method')
; c'est aussi là que vous pouvez utilisercall_user_func()
.Notez que l'utilisation de
call_user_func_*
fonctions ne peuvent pas être utilisés pour appeler des méthodes privées ou protégées.L'alternative à tout cela, c'est de faire de vos fonctions accepter un tableau comme seul argument:
Cependant, ce qui élimine la possibilité de type de l'indice de chaque argument dans votre déclaration de fonction et est généralement considéré comme une odeur de code.
If you don't know beforehand how many arguments you're going to pass to your function, it would be advisable to use call_user_func_array();
- pouvez-vous expliquer avec un exemple de code approprié ?$obj
et sesmethod
ainsi.method
qui prend trois arguments ...call_user_func_array
jouer ici ?Vous devriez préférer l'appel de la fonction que vous souhaitez faire régulièrement. Utilisation
call_user_func_array
dynamique avec des arguments. Par exemple:dynamic arguments
?call_user_func_array
effectue "uncurrying", qui est le contraire de "nourrissage".Suivantes s'applique à tous les PHP "callables" (du nom des fonctions, des fermetures, des méthodes, des
__invoke
, etc.), donc, pour des raisons de simplicité nous allons ignorer les différences et de se concentrer uniquement sur les fermetures.Si nous voulons accepter de multiples arguments, PHP nous permet de le faire avec 3 différentes Api. La méthode habituelle est: est-ce
Une autre façon est appelé au cari forme:
L'avantage est que tout le curry de fonctions peuvent être appelées de la même manière: leur donner un argument.
Si plusieurs arguments sont requis, en plus des fonctions curryfiées sont retournés, qui "se souvenir de" l'argumentation précédente. Cela nous permet de passer des arguments maintenant et le reste plus tard.
Il y a quelques problèmes:
Nous pouvons résoudre tous ces problèmes en utilisant un fonction de conversion (avis de non responsabilité: c'est mon blog). Ceci nous permet d'écrire et d'appeler de ses fonctions de la manière habituelle, mais leur donne même la "mémoire" de la capacité, comme s'ils étaient au curry:
La troisième façon est appelée uncurried et prend tous ses arguments dans un:
Tout comme avec des fonctions curryfiées, uncurried fonctions peuvent tous être appelée avec un argument, bien que cette fois c'est un tableau. Nous avons toujours confrontés aux mêmes problèmes de compatibilité comme le curry de fonctions: si l'on choisit d'utiliser uncurried fonctions, nous ne pouvons pas compter sur tout le monde en choisissant la même. Donc nous avons besoin également d'une fonction de conversion pour uncurrying. C'est ce que
call_user_func_array
n':Fait intéressant, nous pouvons nous débarrasser de ce surcroît d'
function($args)
wrapper (un processus connu sous le nom "eta-réduction") par nourrissagecall_user_func_array
:Malheureusement
call_user_func_array
n'est pas aussi intelligent quecurry
; il n'est pas de convertir automatiquement entre les deux. Nous pouvons écrire notre propreuncurry
fonction qui a cette capacité:Ces fonctions de conversion de montrer que PHP "habitués" à la manière de définir des fonctions est en fait redondante: si nous avons remplacé PHP "habituel" fonctions "smart" au curry ou uncurried ceux, beaucoup de code de travail. Si nous faisions cela, il est préférable de curry tout et de manière sélective uncurry que nécessaire, car c'est plus facile que d'aller dans l'autre sens.
Malheureusement, certaines choses qui s'attendent à un nombre variable d'arguments à l'aide de
func_get_args
allait se briser, ainsi que des fonctions par défaut des valeurs d'argument.Fait intéressant, les valeurs par défaut sont juste une forme particulière de nourrissage. On pourrait surtout faire sans eux, si nous mettons ces arguments première au lieu du dernier, et a fourni un tas d'autres définitions qui curry dans les paramètres par défaut. Par exemple:
De php 5.6, pour passer un tableau au lieu d'une liste d'arguments à une fonction simplement précéder le tableau avec des points de suspension (ce qui est appelé "l'argument de déballage").
La différence entre
call_user_func_array()
et fonctions de la variable de php 5.6 est que les fonctions de la variable ne vous permettent pas d'appeler une méthode statique:Php 7 ajoute la possibilité d'appeler des méthodes statiques via une variable de la fonction, afin de php 7 ce différence n'existe plus. En conclusion,
call_user_func_array()
donne votre code une plus grande compatibilité.