php匿名功能

时间:2014-11-26 11:37:36

标签: php anonymous-function zend-certification

当我阅读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 个答案:

答案 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