代码之家  ›  专栏  ›  技术社区  ›  sharkin

在PHP中动态使用函数原型

  •  3
  • sharkin  · 技术社区  · 16 年前

    我在用PHP编写一个构造,其中解析器决定动态调用哪个函数,如下所示:

    // The definition of what to call
    $function_call_spec = array( "prototype"  => "myFunction", 
                                 "parameters" => array( "first_par"  => "Hello",
                                                        "second_par" => "World"));
    
    // Dispatch
    $funcPrototype = $function_call_spec["prototype"];
    $funcPrototype(); // Here we call function 'myFunction'.
    

    这一切都很好,很漂亮。但接下来要做的是,传递参数,我不知道是否有可能像我想做的那样。不管脚本语言现在能做什么,它总是让我惊叹不已,下面是:

    可以像这样将参数传递给函数:

    // Here we call function 'myFunction' with the array of parameters.
    $funcPrototype( $function_call_spec["parameters"] );
    

    但是,我希望用清晰的参数等正确地声明“myfunction”:

    function myFunction( $first_par, $second_par )
    {
    
    }
    

    接下来的问题是-是否有任何方法可以通过参数数组循环动态地将参数传递给函数?

    澄清,我 不要 想这样做:

    $funcPrototype( $function_call_spec["parameters"]["first_par"],
                    $function_call_spec["parameters"]["second_par"]  );
    

    因为这需要我的代码静态地了解关于MyFunction的细节,这与整个想法背道而驰。

    相反,我想用这样的方式来做,也许:

    // Special magic PHP function which can be used for invoking functions dynamically
    InvokeFunction( $funcPrototype, $function_call_spec["parameters"] );
    

    然后导致调用MyFunction,数组中的所有参数都被传递给原型中的每个单独的参数变量。

    欢迎发表任何评论。

    当做。

    R

    附言:这篇文章中的任何代码都没有经过打字错误等测试。

    4 回复  |  直到 16 年前
        1
  •  11
  •   Kornel    16 年前

    你应该使用 call_user_func_array 它可以调用任何函数或方法并从数组中获取参数。

    或者您可以使用 ReflectionFunction::invokeArgs 但是没有好处 调用用户函数数组 除非您已经将这个类用于其他用途(比如检查您调用的函数是否接受适当数量和类型的参数)。

        2
  •  5
  •   moo    16 年前
    call_user_func_array($funcPrototype, $function_call_spec["parameters"]);
    

    您可能希望创建一个包装器,将函数命名为您的首选项,例如:

    function InvokeFunction($function, $args = array()) {
        return call_user_func_array($function, (array)$args);
    }
    

    使用此函数,您可以用三种不同的方式调用它:

    $return = InvokeFunction('doStuff');
    $return = InvokeFunction('doStuff', $single_arg);
    $return = InvokeFunction('doStuff', $multiple_args);
    
        3
  •  0
  •       16 年前

    call_user_func_array() 如果您不需要执行合同,最好选择,否则使用 ReflectionFunction .

        4
  •  0
  •   poo    16 年前

    http://us2.php.net/create_function

    使用create_function()时,参数在运行时才会计算。很甜。