推导PHP Closure参数

nya*_*cat 8 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);
}

?>
Run Code Online (Sandbox Code Playgroud)

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

Bli*_*itZ 14

reflection如果您需要根据代码结构进行决策,请使用.在你的情况下ReflectionFunction,ReflectionParameter你的朋友.

<?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);
}
?>
Run Code Online (Sandbox Code Playgroud)

输出:

Giving individuals. Result: 5 10
Run Code Online (Sandbox Code Playgroud)

将定义更改为测试:

$func = function(array $a){ echo implode(' ', $a); };
Run Code Online (Sandbox Code Playgroud)

输出:

Giving array. Result: 5 10
Run Code Online (Sandbox Code Playgroud)