【问题标题】:How do I pass a function as a parameter to another function?如何将函数作为参数传递给另一个函数?
【发布时间】:2011-12-23 01:49:52
【问题描述】:

我有一个函数列表a()b()c()
我有一个main() 函数。

根据情况,我需要将不同的函数传递给 main() 以使用。
在 javascript 中它会是:

var a = function(){}
var b = function(){}
var c = function(){}

var func = (some logic) a, b or c;

main(func);

如何在 php5.3 中做到这一点?
我试图避免使用

$func_name = "a";
main($func_name){
   $func_name();
}

或者这可能是最好的方法,我不应该使用任何类型的闭包?

【问题讨论】:

    标签: php closures php-5.3 lambda


    【解决方案1】:

    在 PHP 5.3 中的想法相同,您可以创建 anonymous functions:

    $sayHello = function($var)
    {
        echo "Hello ", $var;
    };
    
    // Logic here to determine what $func is set to
    $func = $sayHello;    
    
    function callCustom($function)
    {
        if(!is_callback($function))
        {
            // throw exception
        }
        $function("World");
    }
    
    callCustom($func);  // Hello World
    

    【讨论】:

    • 有没有办法输入提示? function xxx(func $function){}
    • @ItayMoav:你不能输入提示回调,但你可以添加一个条件来检测参数是否不是回调。
    【解决方案2】:

    试试这个:

    $a = function(){};
    $b = function(){};
    $c = function(){};
    
    switch (rand(0, 2)) {
        case 0: $func = $a; break;
        case 1: $func = $b; break;
        case 2: $func = $c; break;
    }
    
    var_dump($func);
    

    你可以在这里看到一个工作示例http://codepad.viper-7.com/Ut5yGQ

    注意:我使用 var_dump 而不是 main,因为 main 未定义

    【讨论】:

      【解决方案3】:

      在 PHP 中,任何“可调用”(is_callable­Docs) 都可以被调用(调用)。手册中经常将这些参数命名为Callback, a pseudo-type in PHP­Docs

      您可以使用任何不同的回调并将它们作为函数参数传递:

      function main($callback)
      {
          call_user_func($callback);
      }
      

      那么您的函数将适用于任何有效的 PHP 回调。

      除此之外,可以使用变量调用函数,一些示例:

      变量函数调用:

        function name() {};
        $function = 'name'; # function name as string
        $function(); # invoke
      

      匿名函数作为变量函数调用:

        $function = function() {}; # define function
        $function(); # invoke
      

      另见Variable Functions­Docs

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-08-19
        • 1970-01-01
        • 2023-01-12
        • 2013-04-13
        • 2017-08-07
        • 2013-11-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多