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);
}

?>

ディスパッチャーに登録されるクロージャーを定義するのにどちらの方法が適しているかをユーザーが決定できるように、ユーザーにある程度の自由を残したいと思います-連想配列のパラメーターを受け入れるか、クロージャーパラメーターとして直接受け入れるか。したがって、ディスパッチャーは、渡された 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 に答える