【问题标题】:Dynamic functions, variable inputs动态功能,可变输入
【发布时间】:2024-04-27 20:10:01
【问题描述】:

现在,假设我有类似这样的代码...

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

我的问题从这里开始,如何根据这些在参数中指定适当的变量?我有一些想法,例如为每个指定这些功能的函数创建一个列表,但我真的很想看到一个优雅的解决方案。

【问题讨论】:

  • 您希望funcC() 如何处理单参数调用?
  • @Igancio 这就是我要问的。我有逻辑可以根据其他逻辑选择每个函数,但我希望能够分配函数,并使用正确的参数调用它。
  • @John 不,这不是我要问的。我有一组来自请求的特定数据,我希望将其传递给特定函数(已经在数组中定义),但我希望能够创建一个可变参数函数,该函数也被动态分配并提供特定参数。
  • 我不明白这个问题。 $temp_call($var, $var, $var) 在 PHP 中绝对没问题。

标签: php dynamic-variables dynamic-function


【解决方案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);

【讨论】:

  • 不,它们是 3 个功能,而不是 1 个。它们都做非常不同的事情。
  • 我考虑过接受一个数组,但我可能不得不更改一半的代码库以使其能够正常工作,然后我会处理可能有可变参数函数等的问题。
【解决方案2】:

你不能,也许这很好。您可以使用 if/else 找到参数的数量。

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

【讨论】:

  • 这不是计算参数的问题。它们不是 var1、var2 和 var3。它们是 varA1、varA2、varA3 作为一个系列,varB1、varB2 作为一个系列,varC1 作为它自己的系列。我可以将 VarQ1、varQ2 和 super_duper 作为一个系列。
【解决方案3】:

您需要使用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));
?>

【讨论】:

  • 这看起来是朝着正确方向迈出的一步。在我玩了一段时间后,我会告诉你。谢谢。
  • 还有,请不要使用call_user_func 的东西,除非你是动态调用一个方法,因为它有两个问题:它可能不会通过引用传递,而且速度很慢;)
  • 谢谢,我打算使用 call_user_func_array,仅供参考。