48 votes

La fonction de passe PHP en tant que param appelle ensuite la fonction?

J'ai besoin de passer une fonction en tant que paramètre à une autre fonction, puis d'appeler la fonction passée à l'intérieur de la fonction ... C'est probablement plus facile pour moi d'expliquer dans le code..Je veux fondamentalement faire quelque chose comme ça:

 function ($functionToBeCalled)
{
   call($functionToBeCalled,additional_params);
}
 

Y at-il un moyen de faire cela .. J'utilise PHP 4.3.9

Merci!

80voto

Paolo Bergantino Points 199336

Je pense que vous recherchez call_user_func .

Un exemple tiré du manuel PHP:

 <?php
function barber($type) {
    echo "You wanted a $type haircut, no problem";
}
call_user_func('barber', "mushroom");
call_user_func('barber', "shave");
?>
 

28voto

Stewart Robinson Points 1062

En php c'est très simple.

 <?php

function here() {
  print 'here';
}


function dynamo($name) {
 $name();
}

//Will work
dynamo('here');
//Will fail
dynamo('not_here');
 

27voto

tj111 Points 12313
 function foo($function) {
  $function(" World");
}
function bar($params) {
  echo "Hello".$params;
}

$variable = 'bar';
foo($variable);
 

De plus, vous pouvez le faire de cette façon. Voir les fonctions variables .

11voto

mercurial Points 788

Je sais que la question principale à propos de PHP 4.3, mais maintenant c'est quelques années plus tard, et je voulais juste défendre les intérêts de mon moyen préféré pour le faire en PHP 5.3 ou supérieur.

PHP 5.3+ prend maintenant en charge les fonctions anonymes (fermetures), de sorte que vous pouvez utiliser certaines des techniques de programmation fonctionnelles, comme dans les langages comme le JavaScript et Ruby (avec quelques réserves). La réécriture de l'call_user_func exemple ci-dessus dans "la fermeture de style" ressemblerait à ceci, que je trouve plus élégant:

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

$barber('mushroom');
$barber('shave');

Évidemment, ce n'est pas vous acheter beaucoup dans cet exemple - la puissance et la flexibilité apparaît lorsque vous passez ces fonctions anonymes à d'autres fonctions (comme dans la question d'origine). Si vous pouvez faire quelque chose comme:

$barber_cost = function($quantity) {
    return $quantity * 15;
};

$candy_shop_cost = function($quantity) {
    return $quantity * 4.50;   // It's Moonstruck chocolate, ok?
};

function get_cost($cost_fn, $quantity) {
    return $cost_fn($quantity);
}

echo '3 haircuts cost $' . get_cost($barber_cost, 3) . "\n";
echo '6 candies cost $' . get_cost($candy_shop_cost, 6) . "\n";

Cela pourrait être fait avec call_user_func, bien sûr, mais je trouve cette syntaxe beaucoup plus claire, en particulier une fois que les espaces de noms et les variables membres de s'impliquer.

Une mise en garde: je serai le premier à admettre que je ne sais pas exactement ce qui se passe ici, mais vous ne pouvez pas toujours faire appel à une fermeture contenues dans un membre ou variable statique, et, éventuellement, dans certains autres cas. Mais réaffectation à une variable locale permettra d'être invoquée. Ainsi, par exemple, cela vous donnera une erreur:

$some_value = \SomeNamespace\SomeClass::$closure($arg1, $arg2);

Mais cette solution de contournement simple résout le problème:

$the_closure = \SomeNamespace\SomeClass::$closure;
$some_value = $the_closure($arg1, $arg2);

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