mercurial..
11
我知道有关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);