11

我有没有机会推断出 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);
}

?>

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

4

2 回答 2

17

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
于 2013-10-05T14:47:57.313 回答
2

让您的函数能够接受不同类型的输入会容易得多。

例如,在这种情况下:

$foo = function() {
    $args = func_get_args();
    if( is_array($args[0])) $args = $args[0];
    echo $args[0]." ".$args[1];
}
于 2013-10-05T14:26:07.397 回答