2013-03-12 2 views
3

У меня есть функция PHP, которая принимает переменное количество аргументов.Как передать функцию PHP, ожидающую varargs строку?

function foo() { 
    $numargs = func_num_args(); 
    if ($numargs < 3) { 
     die("expected number of args is 3, not " . $numargs); 
    } 
... 

Если я называю это так:

foo(1, 12, 17, 3, 5); 

это нормально, но если я называю это так:

$str = "1, 12, 17, 3, 5"; 
    foo($str); 

это терпит неудачу, потому что говорит, что я лишь вскользь один аргумент , Какое изменение мне нужно сделать, если я бы предпочел не изменять сама функцию, а только соглашение о вызове.

- обновление: для сохранения разрыва вызова я просто построил массив. И поскольку функция была функцией-членом, соглашение о вызове было немного иным. Таким образом, код закончился

$list = array(); 
$list[] = 1; 
$list[] = 12; 
$list[] = 17; 
// etc. 
call_user_func_array(array($this, 'foo'), $list); 

Думал, что это может быть полезно кому-то еще.

ответ

4

Это должно сделать трюк:

$str = "1, 12, 17, 3, 5"; 
$params = explode(', ', $str); 
call_user_func_array ('foo', $params); 

call_user_func_array() позволяет вызывать функцию и передавая ее аргументы, которые хранятся в массиве. Таким образом, элемент массива в индексе 0 становится первым параметром функции и т. Д.

http://www.php.net/manual/en/function.call-user-func-array.php

обновление: вам придется сделать некоторые дополнительные обработки на $params массив, если вы хотите, что аргументы будут целые числа (они передаются в виде строк, если вы используете выше фрагмент кода).

+1

+1 для обновления. Да, передача строк дала мне проблемы, поэтому я использовал массив, чтобы убедиться, что он будет иметь тип int, как указано в моем уточнении вопроса выше. –

3
$str = "1, 12, 17, 3, 5"; 
call_user_func_array('foo',explode(',',$str));