2010-07-12 2 views
0

Прямо сейчас, позволяет сказать, что у меня есть код много, как это ...Динамические функции, переменные входы

$some_var=returnsUserInput(); 

function funcA($a) {...} 
function funcB($a,$b) {...} 
function funcC($a,$b,$c) {...} 

$list[functionA] = "funcA"; 
$list[functionB] = "funcB"; 
$list[functionC] = "funcC"; 

$temp_call = list[$some_var]; 

//Not sure how to do this below, just an example to show the idea of what I want. 
$temp_call($varC1,varC2,$varC3); 
$temp_call($varB1,varB2); 
$temp_call($varA1); 

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

+0

Как вы ожидаете 'funcC()' обрабатывать вызов с одним аргументом? –

+0

Возможный дубликат [Как заставить функцию принимать неограниченное количество параметров в PHP?] (Http://stackoverflow.com/questions/3078454/how-can-a-make-a-function-accept-an- unlimited-number-of-parameters-in-php) –

+0

@Igancio Вот что я прошу. У меня есть логика для выбора каждой функции, основанной на другой логике, но я хочу иметь возможность назначить функцию и называть ее правильными аргументами. – Incognito

ответ

1

Вам необходимо использовать call_user_func или call_user_func_array.

<?php 
// if you know the parameters in advance. 
call_user_func($temp_call, $varC1, $varC2); 
// If you have an array of params. 
call_user_func_array($temp_call, array($varB1, $varB2)); 
?> 
+0

Это похоже на шаг в правильном направлении. После того, как я буду играть с этим некоторое время, я дам вам знать. Спасибо. – Incognito

+0

И, пожалуйста, не используйте материал 'call_user_func', если вы не динамически вызываете метод, потому что он имеет две проблемы: он может не проходить по ссылке, и он медленный;) – NikiC

+0

Спасибо, я намерен использовать call_user_func_array, просто FYI. – Incognito

-1

Вы не можете и, может быть, это хорошо. Вы можете найти количество аргументов с if/else.

если ($ temp_call == "funcA") {.....} ELSEIF (...) ...

+0

Это не вопрос подсчета аргументов. Они не являются var1, var2 и var3.Это varA1, varA2, varA3 как серия, varB1, varB2 как серия, а varC1 - как собственная серия. Я мог бы иметь VarQ1, varQ2 и super_duper как ряд. – Incognito

1

Вы хотите что-то вроде следующего?

function test() 
{ 
    $num_args = func_num_args(); 

    $args  = func_get_args(); 

    switch ($num_args) { 
     case 0: 
      return 'none'; 
     break; 


     case 1: 
      return $args[0]; 

     break; 

     case 2: 
      return $args[0] . ' - ' . $args[1]; 
     break; 

     default: 

      return implode($args, ' - '); 
     break; 
    } 
} 

echo test(); // 'none' 
echo test(1); // 1 
echo test(1, 2); // 1 - 2 
echo test(1, 2, 3); // 1 - 2 - 3 

Это будет действовать как способ делегирования.

А как насчет принятия массива, а не параметров?

function funcA($params) 
{ 
    extract($params); 

    echo $a; 
} 

function funcB($params) 
{ 
    extract($params); 

    echo $a, $b; 
} 

function funcC($params) 
{ 
    extract($params); 

    echo $a, $b, $c; 
} 


$funcs = array('funcA', 'funcB', 'funcC'); 

$selected = $funcs[0]; 


$selected(array('a' => 'test', 'b' => 'test2')); 

// or something like (beware of security issues) 
$selected($_GET); 
+0

Нет, это 3 функции, а не 1. Они все делают совсем по-другому. – Incognito

+0

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

Смежные вопросы