当作为参数传递时,PHP如何解释和评估函数和匿名函数?

时间:2015-11-20 07:15:45

标签: php php-5.3 php-5.4 php-5.5 php-5.6

我是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 {strong>如何执行/解释/评估 callFunction方法中的两个函数。我研究搜索引擎的相同但无法找到可以正确解释相同的确切答案。请帮我理解这两种情况。

1 个答案:

答案 0 :(得分:2)

让我们分别看两个案例:

<?php

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

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

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

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

  

PHP支持变量函数的概念。这意味着,如果一个   变量名称附加括号,PHP将查找   与变量求值的名称相同的函数,和   将尝试执行它。除此之外,这可以用来   实现回调,函数表等。

现在,第二个案例:

<?php

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

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

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

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

您甚至可以强制执行参数输入,以便将其分为两个不同的type hinting个案例:     

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

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

所以基本上callFunction接收的参数类型完全不同(字符串与Closure),但是PHP语法对于它们执行函数调用都是相同的。 (这不是巧合,它是这样设计的。)

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