2013-03-30 20 views
5

Jestem ciekawy, czy istnieje sposób wywołania funkcji za pomocą asocjacyjnej tablicy w celu zadeklarowania parametrów.Przekaż asocjacyjną tablicę do funkcji w PHP

Na przykład jeśli mam tę funkcję:

function test($hello, $world) { 
    echo $hello . $world; 
} 

Czy istnieje jakiś sposób, aby nazwać to robi coś takiego?

call('test', array('hello' => 'First value', 'world' => 'Second value')); 

jestem zaznajomiony z użyciem call_user_func i call_user_func_array, ale szukam czegoś bardziej ogólne, że można używać różnych metod, aby zadzwonić, gdy nie wiem jakie parametry są szuka wyprzedzeniem.

Edytuj: Powodem tego jest utworzenie jednego interfejsu dla interfejsu API interfejsu API. Akceptuję JSON i zamieniam to w tablicę. Chciałbym więc wywołać różne metody i przekazać wartości z wejścia JSON do metod. Ponieważ chcę móc wywoływać asortyment różnych metod z tego interfejsu, chcę mieć sposób przekazywania parametrów do funkcji bez znajomości kolejności, w jakiej powinny być. Myślę, że za pomocą refleksji otrzymam wyniki I Szukam.

+0

Czy istnieje jakikolwiek powód * dlaczego * chcesz to zrobić? –

+0

To jest dla interfejsu API. Akceptuję JSON i zamieniam to w tablicę. Chciałbym więc wywołać różne metody i przekazać wartości z wejścia JSON do metod. – cbulock

Odpowiedz

2

Można użyć tej funkcji wewnętrznej w swoich funkcjach func_get_args()

więc można go używać jak ten:

function test() { 
    $arg_list = func_get_args(); 
    echo $arg_list[0].' '.$arg_list[1]; 
} 

test('hello', 'world'); 
2

Z PHP 5.4+, to działa

function test($assocArr){ 
    foreach($assocArr as $key=>$value){ 
    echo $key . ' ' . $value . ' '; 
    } 
} 

test(['hello'=>'world', 'lorem'=>'ipsum']); 
0

Następujące powinny działać ...

function test($hello, $world) { 
    echo $hello . $world; 
} 

$callback = 'test'; <-- lambdas also work here, BTW 

$parameters = array('hello' => 'First value', 'world' => 'Second value'); 

$reflection = new ReflectionFunction($callback); 
$new_parameters = array(); 

foreach ($reflection->getParameters() as $parameter) { 
    $new_parameters[] = $parameters[$parameter->name]; 
} 

$parameters = $new_parameters; 

call_user_func_array($callback, $parameters); 
Powiązane problemy