推导PHP Closure参数

时间:2013-10-05 14:22:09

标签: php closures

我是否有可能推断出PHP Closure参数类型信息?考虑这个例子:

<?php

$foo = function(array $args)
{
    echo $args['a'] . ' ' . $args['b'];
};

$bar = function($a, $b)
{
    echo $a . ' ' . $b;
};

$closure = /* some condition */ $foo : $bar;

if(/* $closure accepts array? */)
{
    call_user_func($closure, ['a' => 5, 'b' => 10]);
}
else
{
    call_user_func($closure, 5, 10);
}

?>

我想为用户留下一些自由,以便他或她可以决定哪种方式更好地定义将在我的调度程序中注册的Closure - 它是否接受关联数组中的参数或直接作为Closure参数。因此,调度程序需要推导传递的Closure的参数,以确定它应该调用此Closure的方式。有什么想法吗?

2 个答案:

答案 0 :(得分:12)

如果您需要根据代码结构做出决策,请使用reflection。在您的情况下,ReflectionFunctionReflectionParameter是您的朋友。

<?php
header('Content-Type: text/plain; charset=utf-8');

$func = function($a, $b){ echo implode(' ', func_get_args()); };

$closure    = $func;
$reflection = new ReflectionFunction($closure);
$arguments  = $reflection->getParameters();

if($arguments && $arguments[0]->isArray()){
    echo 'Giving array. Result: ';
    call_user_func($closure, ['a' => 5, 'b' => 10]);
} else {
    echo 'Giving individuals. Result: ';
    call_user_func($closure, 5, 10);
}
?>

输出:

Giving individuals. Result: 5 10

将定义更改为测试:

$func = function(array $a){ echo implode(' ', $a); };

输出:

Giving array. Result: 5 10

答案 1 :(得分:2)

让你的功能能够接受不同类型的输入要容易得多。

例如,在这种情况下:

$foo = function() {
    $args = func_get_args();
    if( is_array($args[0])) $args = $args[0];
    echo $args[0]." ".$args[1];
}