Динамические функции, переменные входы - PullRequest
0 голосов
/ 12 июля 2010

Прямо сейчас, допустим, у меня есть такой код ...

$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);

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

Ответы [ 3 ]

1 голос
/ 13 июля 2010

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

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);
1 голос
/ 12 июля 2010

Вам необходимо использовать 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 голосов
/ 12 июля 2010

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

if ($ temp_call == "funcA") {.....} elseif (...) ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...