当我阅读Zend Certified PHP Engineer 5.5的问题时,我看到了关于匿名函数的问题,但我需要解释它是如何工作的。
function z($x)
{
return function($y) use ($x)
{
return str_repeat( $y , $x );
};
}
$a = z(2);
$b = z(3);
echo $a(3).$b(2);
此代码的输出为:
33222
但是在函数标题中,只有$x
参数来自$y
的值!
答案 0 :(得分:3)
函数z
创建并返回一个新函数,但是一个匿名函数。定义了这个新函数,以便它有一个参数 - $y
。但是,此匿名函数还使用函数$x
中的参数z
。
为简单起见,函数z
基本上创建了一个函数,它可以重复任何字符串,但是固定次数。字符串重复的次数由$x
中参数z
的值确定。
因此,调用z(2)
会创建一个新函数,该函数在功能上等同于编写
function repeat_two_times($y) {
return str_repeat($y, 2);
}
在您的示例中,硬编码值2由$ x。
的值确定您可以在documentation中详细了解相关信息。该示例显示的原则对于创建{5},如add5,inc10,...
非常有用答案 1 :(得分:2)
首先,初始化函数z:
$a = z(2);
示例中的 $x
设置为2,因此返回的函数(匿名函数,也称为闭包)现在可以读作(因为使用了$x
):
$a = function($y) {
return str_repeat($y, 2);
}
调用此函数时:
echo $a(3);
您正在为此返回函数提供参数3($y
)。
输出为:33
答案 2 :(得分:1)
匿名函数也称为Closures
。
你问$y
在哪里获得它的价值。代码示例很难破译,因为你到处都使用2和3。如果您的最后一行是
$a = z(2);
$b = z(3);
echo $a('A').$b('B');
这将导致:
AABBB
但是,请关注您的代码。请注意,有两个相关的函数调用
$a = z(2);
和
echo $a(3);
使用参数2调用函数z()
将返回一个函数(指定名称为$a
),其中行
return str_repeat($y, $x);
实际上是:
return str_repeat($y, 2);
现在,你用参数3调用那个函数$a()
。那个3($y
的值)重复两次
同样的分析也适用于其他相关的函数调用:
$b = z(3);
...
echo ... $b(2);
但在这种情况下,2重复3次
答案 3 :(得分:0)
function z($x)
{
return function($y) use ($x)
{
return str_repeat( $y , $x );
};
}
$a = z(2);// here you are setting value of x by 2
$b = z(3);// here you are setting value of x by 3
echo $a(3).$b(2);// here $a(3) 3 is value of y so it becomes str_repeat( 3 , 2 ); which is 33