我是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
方法中的两个函数。我研究搜索引擎的相同但无法找到可以正确解释相同的确切答案。请帮我理解这两种情况。
答案 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对象如何作为模板化参数传递给函数,然后用括号运算符执行。