2013-10-05 70 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的方式。有任何想法嗎?

回答

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

是啊,我知道,但是這樣會讓事情不舒服爲我的用戶誰寫他們的閉包。我的目標是擺脫任何類型的需求,讓用戶在沒有任何關於實現方式的特殊知識的情況下實現他的Closure。 –