2013-10-05 39 views
8

Có cơ hội nào để tôi có thể suy ra thông số loại đóng của PHP không? Hãy xem xét ví dụ sau:Tham số đóng gói PHP tham số

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

?> 

Tôi muốn để lại một số tự do cho người dùng để họ có thể quyết định đó là cách tốt hơn để xác định một Đóng rằng sẽ được đăng ký trong điều phối của tôi - nó sẽ chấp nhận các thông số trong mảng kết hợp hoặc trực tiếp như thông số đóng cửa. Vì vậy, dispatcher cần phải suy ra các tham số của Closure đã được thông qua để xác định cách nó nên gọi là Closure này. Bất kỳ ý tưởng?

Trả lời

10

Sử dụng reflection, nếu bạn cần phải đưa ra quyết định, dựa trên cấu trúc mã. Trong trường hợp của bạn ReflectionFunctionReflectionParameter là bạn của bạn.

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

Output:

Giving individuals. Result: 5 10 

Thay đổi định nghĩa để kiểm tra:

$func = function(array $a){ echo implode(' ', $a); }; 

Output:

Giving array. Result: 5 10 
+0

Chỉ là những gì tôi đang tìm kiếm! Cảm ơn bạn, tôi không biết rằng PHP đã phản ánh :) –

+0

@ nyan-cat Chúc mừng. Vui mừng được giúp đỡ. – BlitZ

2

Sẽ dễ dàng hơn nhiều khi chức năng của bạn có thể chấp nhận các loại đầu vào khác nhau.

Ví dụ, trong trường hợp này:

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

Yea, tôi biết, nhưng điều này sẽ làm cho mọi việc khó chịu cho người dùng của tôi người viết đóng cửa của họ. Mục tiêu của tôi là loại bỏ bất kỳ loại yêu cầu nào, để cho người dùng thực hiện Đóng cửa của mình mà không có bất kỳ kiến ​​thức đặc biệt nào về cách triển khai. –

Các vấn đề liên quan