我是一个 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/