在PHP中,如何在另一个函数中使用函数作为参数?

时间:2016-01-01 18:30:39

标签: php function parameters closures anonymous-function

我知道之前可能已经提出过这个问题,但是我不太了解匿名函数(闭包)的整个概念,以及它们如何适用于我的情况。注意:我知道拥有所有这些简单的功能是非常愚蠢的,但是我的任务要求说我应该拥有所有这些功能:/。 我有几个功能。在下面的函数中,参数$action1$action2将被函数替换:

function dothis($num1, $num2, $action1, $action2)
{
    $result = $num1 + $num2;
    if ($result > 52){
        //do $action1 which is a function
    } else {
        //do $action2 which is another function
    }

    return $result;
}

函数dothis将在另一个名为add的函数中调用。这是add函数:

function add($action1,$action2) 
{
     $answer = dothis(42, 34, $action1, $action2);
     echo $answer;
}
$action1函数中的

$action2add$action1函数中的$action2dothis基本相同。他们现在需要有不同的名字,即使它们是相同的东西吗?

现在,add函数将在main函数中调用,其中参数$action1$action2将被它们对应的实际函数替换:

function main() 
{
    add($fun1,$fun2);
    echo 'Arithmetic complete';
}

这是$fun1$fun2的代码:

$fun1 = function () {
    echo 'Wow! The answer is greater than 52.';
};

$fun2 = function () {
    echo 'Oh no! The answer is less than 52.'; 
};

我该怎么做,我需要改变什么?我非常感谢任何帮助。提前谢谢!

2 个答案:

答案 0 :(得分:3)

请参阅Variable Functions

上的PHP文档

你可以通过在()之后调用一个函数(必要时在括号内加参数)。

function dothis($num1,$num2,$action1,$action2){
    $result = $num1 + $num2;
    if ($result > 52){
        $action1();
    }
    else{
        $action2();
    }
    return $result;
}

要使用此语法处理匿名函数,您必须关闭eAccelerator。见Anonymous functions does not work: Function name must be a string

如果您不能使用匿名函数,则需要使用命名函数。

function fun1 () {
    echo 'Wow! The answer is greater than 52.';
}
$fun1 = 'fun1';

function fun2() {
    echo 'Oh no! The answer is less than 52.';
}
$fun2 = 'fun2';

答案 1 :(得分:2)

我想这是一个相当糟糕的方法。您可以使用call_user_func()之类的函数,但不能使用anonymous functions。为什么不提出一个定义两个函数的类或(如果代码相当短)但是直接在if / else语句中?

类方法的一些虚拟示例代码:

class doSomething {

    function dothis($num1, $num2) {
        $result = $num1 + $num2;
        if ($result > 52) {
            $this->action1($num1, $num2);
        } else {
            $this->action2($num1, $num2);
        }
        return $result;
    }

    function action1($numbers) {
        // do sth. here
    }

    function action2($num1, $num2) {
        // do sth. else here
    }
}

// afterwards
$pointer = new doSomething();
$pointer->dothis(21,34); // action1
$pointer->dothis(1,1);   // action2