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は新しい関数を作成して返しますが、匿名の関数です。その新しい関数は、1 つの引数 - を持つように定義されています$y。ただし、この無名関数は$x関数の引数も使用しますz

簡単にするために、関数zは基本的に任意の文字列を繰り返すことができる関数を作成しますが、回数は固定です。文字列が繰り返される回数は、 の引数の値によって決まり$xます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その値を取得するかを尋ねます。コード例は、どこでも 2 と 3 を使用しているため、解読が困難です。最後の行が

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

その結果、次のようになります。

AABBB

しかし、あなたのコードに従ってみましょう。2 つの関連する関数呼び出しがあることに注意してください。

 $a = z(2);

 echo $a(3);

引数 2 を指定してfunction を呼び出すz()と、( name が割り当てられた$a)関数が返されます。

 return str_repeat($y, $x);

は実際には:

 return str_repeat($y, 2);

ここで、その関数$a()を引数 3 で呼び出します。その 3 ( の値$y) が 2 回繰り返されます。

同じ分析が他の関連する関数呼び出しにも適用されます。

 $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 に答える