ラムダまたは無名関数は、名前のない単なる関数です。
例えば
$lambda = function($a, $b) { echo $a + $b; };
クロージャーは、パラメーター リストで指定されていない変数にアクセスできる関数です。PHP 5.3+ では、これらの変数は use キーワードの後に指定され、クロージャ関数の関数定義が実行されるときに値または参照によってリンクされます。
例えば
$foo = 'hello';
$closure = function() use ($foo) { echo $foo; };
$closure();
JavaScript では、関数がネストされている場合、スコープ チェーンが存在するという意味で、すべての関数はクロージャーです。たとえば、最も内側の関数は、1. そのローカル変数、2. として知られる、それを囲むスコープ内の関数のローカル変数にアクセスできます。そのクロージャ スコープ、3. クロージャ スコープのクロージャ スコープとして知られる、エンクロージング スコープのエンクロージング スコープのローカル変数、...、など、N にもアクセスできるようになるまで続きます。最上位のスコープ。最も内側のスコープで var を使用して宣言された変数は、外側のスコープの変数をマスクします。それ以外の場合、最も内側の変数が外側のスコープのものと同じ名前を持ち、var で宣言されていない場合、外側のスコープの変数が使用されます。
var zero = 0; // global scope
function f1() {
var one = 1; // third-level closure scope of f4
function f2() {
var two = 2; // second-level closure scope of f4
function f3() {
var three = 3; // first-level closure scope of f4
function f4() {
var four = 4; // local scope of f4
console.log(zero + one + two + three + four);
}
f4();
}
f3();
}
f2();
}
f1();
これは、次の PHP コードと同等です。
<?php
$zero = 0; // global scope
$f1 = function() use ($zero) {
$one = 1; // third-level closure scope of f4
$f2 = function() use ($zero, $one) {
$two = 2; // second-level closure scope of f4
$f3 = function() use ($zero, $one, $two) {
$three = 3; // first-level closure scope of f4
$f4 = function() use ($zero, $one, $two, $three) {
$four = 4; // local scope of f4
echo $zero + $one + $two + $three + $four;
};
$f4();
};
$f3();
};
$f2();
};
$f1();
?>
これについてはすべてここで説明します。
ここで私の質問です。なぜPHPのクロージャーはラムダ関数でなければならないのですか? JavaScript では、すべての関数がクロージャーですが、ラムダ関数である必要はありません。では、なぜ PHP で次のことができないのでしょうか?
$foo = 'hello';
function closure() use ($foo) { echo $foo; } // PHP reports a syntax error here
closure();
(致命的なエラー: 構文エラー、予期しない T_USE、';' または '{' が必要です)