【问题标题】:In PHP, how do you use a function as a parameter in another function?在 PHP 中,如何在另一个函数中使用一个函数作为参数?
【发布时间】:2016-04-06 03:47:26
【问题描述】:

我知道以前可能有人问过这个问题,但我不太了解匿名函数(闭包)的整个概念,以及它们如何具体应用于我的情况。注意:我知道拥有所有这些简单的功能很傻,但我的任务要求说我应该拥有所有这些功能:/。 我有几个功能。在下面的函数中,参数$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;
}

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

现在,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.'; 
};

我应该怎么做,我需要改变什么?我真的很感激任何帮助。提前致谢!

【问题讨论】:

  • 与您的问题无关,但是当您将闭包分配给变量时,您仍然需要使用 ; 终止您的分配。
  • @localheinz 谢谢!确实如此。我完全忘记了!

标签: php function parameters closures anonymous-function


【解决方案1】:

请参阅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';

【讨论】:

  • dothis函数中,$action1$action2仍然是参数;所以它们实际上还没有在这里起作用。我试图这样做,但它给了我一个错误致命错误:函数名必须是字符串。我该怎么办?
  • 您使用的是什么版本的 PHP?这应该适用于 PHP 5.3 及更高版本。
  • 很奇怪。它适用于运行 5.3 的 Mac,但在运行 5.6 的 ideone.com 中出现该错误。
  • 我在 windows 上使用 5.6。
  • 在我的回答中查看我刚刚链接到的问题。关闭 eAccelerator
【解决方案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

【讨论】:

  • 谢谢--> 现在我完全明白你所说的定义函数的类的意思了!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-11-09
  • 2018-11-13
  • 1970-01-01
  • 1970-01-01
  • 2018-06-30
  • 2015-01-30
  • 2021-11-26
相关资源
最近更新 更多