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

4 回答 4

3

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

为了简单起见,functionz基本上创建了一个可以重复任何字符串但次数固定的函数。字符串重复的次数由参数$xin的值决定z

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

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

在您的示例中,硬编码值 2 由 $x 的值确定。

您可以在文档中阅读有关此内容的更多信息。示例显示的原理对于创建部分函数(如 add5、inc10、...)非常有用

于 2014-11-26T11:46:49.727 回答
2

首先,初始化函数 z:

$a = z(2);

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

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

调用此函数时:

echo $a(3);

您正在为这个返回函数提供参数 3 ( $y)。

输出是:33

于 2014-11-26T11:44:57.973 回答
1

匿名函数也称为Closures.

你问从哪里$y得到它的价值。代码示例很难破译,因为您到处都使用 2s 和 3s。如果你的最后几行是

$a = z(2);
$b = z(3);
echo $a('A').$b('B');

这将导致:

AABBB

但是,让我们遵循您的代码。注意有两个相关的函数调用

 $a = z(2);

 echo $a(3);

使用参数 2调用函数z()返回一个函数(即被分配了 name $a),其中 line

 return str_repeat($y, $x);

在现实中:

 return str_repeat($y, 2);

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

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

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

但在这种情况下 2 重复 3 次

于 2014-11-26T11:46:54.363 回答
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
于 2014-11-26T11:49:29.037 回答