95 votes

PHP call_user_func vs. juste appeler la fonction

Je suis sûr qu'il y a une explication très simple à cela. Quelle est la différence entre ceci :

function barber($type){
    echo "You wanted a $type haircut, no problem\n";
}
call_user_func('barber', "mushroom");
call_user_func('barber', "shave");

... et ceci (et quels en sont les avantages ?) :

function barber($type){
    echo "You wanted a $type haircut, no problem\n";
}
barber('mushroom');
barber('shave');

93voto

Kai Points 4954

Utilisez toujours le nom réel de la fonction lorsque vous le connaissez.

call_user_func permet d'appeler des fonctions dont vous ne connaissez pas le nom à l'avance, mais elle est beaucoup moins efficace car le programme doit rechercher la fonction au moment de l'exécution.

0 votes

Merci Kai. call_user_func s'est avéré être exactement ce dont j'avais besoin.

44 votes

call_user_func n'est pas nécessairement nécessaire. Vous pouvez toujours appeler une fonction en utilisant des fonctions variables : $some_func() . call_user_func_array est celui qui est vraiment utile.

24 votes

Php a toujours besoin de "chercher la fonction au moment de l'exécution".

33voto

Lucas Oman Points 9027

Bien que vous puissiez appeler des noms de fonctions variables de cette manière :

function printIt($str) { print($str); }

$funcname = 'printIt';
$funcname('Hello world!');

il y a des cas où vous ne savez pas combien d'arguments vous passez. Considérez ce qui suit :

function someFunc() {
  $args = func_get_args();
  // do something
}

call_user_func_array('someFunc',array('one','two','three'));

C'est également pratique pour appeler les méthodes statiques et les méthodes objet, respectivement :

call_user_func(array('someClass','someFunc'),$arg);
call_user_func(array($myObj,'someFunc'),$arg);

8 votes

Je sais que c'est vieux comme le monde, mais je n'ai pas trouvé d'articles ailleurs. Est-il plus avantageux d'utiliser call_user_func('customFunction') plutôt que $variableFunction() ? Quelles sont les différences ? Merci !

13voto

Brian Schroth Points 2000

Le site call_user_func L'option est là pour que vous puissiez faire des choses comme :

$dynamicFunctionName = "barber";

call_user_func($dynamicFunctionName, 'mushroom');

où le dynamicFunctionName pourrait être plus excitant et généré au moment de l'exécution. Vous ne devriez pas utiliser call_user_func à moins d'y être obligé, car il est plus lent.

3 votes

Il semble que vous pourriez utiliser une fonction variable dans ce scénario.

5voto

pivotal Points 340

J'imagine que c'est utile pour appeler une fonction dont on ne connaît pas le nom à l'avance... Quelque chose comme :

switch($value):
{
  case 7:
  $func = 'run';
  break;
  default:
  $func = 'stop';
  break;
}

call_user_func($func, 'stuff');

6 votes

Non. On peut toujours faire $func('stuff');

1 votes

Oui, mais la différence est que l'utilisation d'une variable produira une erreur fatale PHP contre un avertissement PHP si call_user_func est utilisé.

0 votes

Ceci n'a pas réduit à néant la valeur des fonctions variables sur call_user_func() dans ce scénario.

0voto

SilentGhost Points 79627

Dans votre premier exemple, vous utilisez le nom de la fonction qui est une chaîne de caractères. il peut venir de l'extérieur ou être déterminé à la volée. c'est-à-dire que vous ne savez pas quelle fonction devra être exécutée au moment de la création du code.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X