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);