2013-10-05 18 views
8

PHPクローズパラメータのタイプ情報を推測できる可能性はありますか?それは直接連想配列またはのパラメータを受け入れます - 私は彼または彼女は私のディスパッチャに登録されますクロージャーを定義するために優れている方法を決めることができるようにユーザーのためのいくつかの自由を残したいPHPクローズパラメータを控除

<?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とどのように呼び出すべきかを判断する必要があります。何か案は?

答えて

10

使用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 
+0

私が探していたもの!ありがとう、私はPHPが反射を持っていることを知らなかった:) –

+0

@ nyan-cat乾杯。喜んで助けてください。 – BlitZ

2

異なる種類の入力を受け入れることができるようにする方がはるかに簡単です。この場合、例えば

、:

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

いや、私は知っているが、これは私のユーザーのために物事が不快になります誰が彼らのClosuresを書く。私の目標は、実装方法についての特別な知識なしにユーザーがClosureを実装できるように、あらゆるタイプの要件を取り除くことです。 –

関連する問題