PHP匿名函数

3

我在阅读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的值!

4个回答

3

函数z创建并返回一个新函数,但是匿名的。这个新函数被定义为只有一个参数-$y。然而,这个匿名函数也使用了来自函数z的参数$x

简单来说,函数z基本上创建了一个可以重复任何字符串固定次数的函数。字符串重复的次数由z中参数$x的值决定。

因此,调用z(2)会创建一个新函数,其功能等同于编写

function repeat_two_times($y) {
    return str_repeat($y, 2);
}

在你的例子中,硬编码值2是由$x$的值确定的。
你可以在文档中阅读更多相关信息。这个例子展示的原则对于创建像add5、inc10等偏函数非常有用。

2
首先,您需要初始化函数z:
$a = z(2);

$x在示例中被设置为2,因此返回的函数(匿名函数,也称闭包)现在可以被看作是这样的(因为使用了$x):

$a = function($y) {
    return str_repeat($y, 2);
}

调用此函数时:
echo $a(3);

您正在将参数3($y)输入此返回函数。
输出结果为:33

1

匿名函数也被称为闭包。

你问 $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);

is in reality :

 return str_repeat($y, 2);

现在,您调用带有参数3的函数$a()。该3($y的值)重复两次。

相同的分析适用于其他相关的函数调用:

 $b = z(3);
 ...
 echo ... $b(2); 

但在这种情况下,数字2被重复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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接