Я знаю исходный вопрос о PHP 4.3, но теперь прошло несколько лет, и я просто хотел отстаивать свой предпочтительный способ сделать это в PHP 5.3 или выше.
PHP 5.3+ теперь включает поддержку анонимных функций (замыканий), поэтому вы может использовать некоторые стандартные методы функционального программирования, например, в таких языках, как JavaScript и Ruby (с некоторыми оговорками). Переписывание приведенного выше примера call_user_func в «стиль закрытия» будет выглядеть так, что я считаю более элегантным:
$barber = function($type) {
echo "You wanted a $type haircut, no problem\n";
};
$barber('mushroom');
$barber('shave');
Очевидно, что в данном примере это не принесет вам многого - мощность и гибкость проявляются тогда, когда вы передаете эти анонимные функции другим функциям (как в исходном вопросе). Итак, вы можете сделать что-то вроде:
$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";
Конечно, это можно сделать с помощью call_user_func, но я считаю этот синтаксис более ясным, особенно когда задействованы пространства имен и переменные-члены.
Одно предостережение: я первым признаю, что не знаю точно, что здесь происходит, но вы не всегда можете вызвать замыкание, содержащееся в члене или статической переменной, и, возможно, в некоторых других случаях. Но переназначение его локальной переменной позволит вызвать его. Так, например, это приведет к ошибке:
$some_value = \SomeNamespace\SomeClass::$closure($arg1, $arg2);
Но этот простой обходной путь решает проблему:
$the_closure = \SomeNamespace\SomeClass::$closure;
$some_value = $the_closure($arg1, $arg2);
person
mercurial
schedule
06.12.2013