我是一个 PHP 经验开发者,我已经知道什么是函数,什么是匿名函数。我也知道匿名函数和函数在 PHP 或其他语言中的用途。我也知道函数和匿名函数之间的区别。

匿名函数的定义可在以下位置获得:
http://php.net/manual/en/functions.anonymous.php

我在这里得到了匿名函数的用例:
Why and how do you use anonymous functions in PHP?

但我的问题是 PHP 如何将函数解释/评估为参数?

考虑下面的例子:

<?php

function callFunction($function)
{
    $function();
}

//normal function
function test()
{
    echo "here";
}

//anonymous function
$function = function () {
    echo 'here';
};

//call normal function test
callFunction('test');

//call anonymous function $function
callFunction($function);

在上面的例子中,两个函数都产生相同的输出。

但我想知道 PHP 如何在 callFunction 方法中执行/解释/评估 两个函数。我研究了相同的搜索引擎,但无法找到可以正确解释相同内容的确切答案。请帮助我理解这两种情况。

最佳答案

我们分别看一下这两种情况:

<?php

function callFunction($function)
{
    $function();
}

//normal function
function test()
{
    echo "here";
}

//call normal function test
callFunction('test');

在这种情况下,callFunction 的实际参数是值“here”,因此传递了 string 值。但是,PHP 的语法支持使其成为动态函数调用的概念: variable functions



现在,进入第二种情况:
<?php

function callFunction($function)
{
    $function();
}

//anonymous function
$function = function () {
    echo 'here';
};

//call anonymous function $function
callFunction($function);

在这种情况下 $function 是一个 闭包 ,正如引用 you linked 中提到的那样。它是PHP中函数对象概念的实现方式。然后使用括号运算符执行接收到的闭包。

您甚至可以强制输入参数,以便使用 type hinting 将其分为两种不同的情况:

// NOTE: string type hinting only available since PHP7
function callFunction_string(string $function)
{
    $function();
}

function callFunction_closure(Closure $function)
{
    $function();
}

所以基本上callFunction接收到的参数类型是完全不同的(string vs. Closure),但是他们执行函数调用的PHP语法是相同的。 (这不是巧合,它就是这样设计的。)

注意:类似的解决方案在编程语言中很普遍,即使在像 C++ 这样的强类型语言中也是如此:看看如何将函数指针、仿函数和 lamda 对象作为 - 模板化 - 参数传递给函数,然后使用括号运算符执行。

关于php - 作为参数传递时,PHP 如何解释和评估函数和匿名函数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33820965/

10-14 14:23
查看更多