何が出力されるでしょうか1。
PHP
$int = 1;
function foo(){
$int = 2;
$bar = function() use($int){
return $int;
};
$int = 3;
return $bar();
}
$int = 4;
echo foo(); // ???
JavaScriptであれば、答えは3
です。
JavaScript
int = 1;
function foo(){
int = 2;
bar = function(){
return int;
}
int = 3;
return bar();
}
int = 4;
foo(); // 3
JavaScriptの場合、関数を呼び出したときの変数の値が使われます。
逆に言うと、関数定義時には変数が定義されている必要すらありません。
JavaScript
function foo(a){
return a + b;
}
foo(1); // b is not defined
b = 2;
foo(1); // 3
letやconstを使わないかぎり、うっかり変数名が被っただけで死にます。
PHPの場合は、useしたときに変数が定義されていなければUndefined variableになります。
ということでPHPでの答えは2
です。
マニュアルにもしっかり書かれています。
引き継がれた変数の値は、関数が定義された時点のものであり、関数が呼ばれた時点のものではありません
PHPには、JavaScriptのように使用時の変数を反映させる方法はありません。
PHP
$foo = function () use (&$bar) {
return $bar;
};
$bar = 1;
echo $foo(); // 1
$bar = 2;
echo $foo(); // 2
ありません。
そもそもPHPでクロージャを使うメリットがわかりません。
というか、実はそれ以前に、冒頭のコードは関数ではなく実行結果を返しているのでクロージャですらありません。
何がしたかったんだこのコード。
-
PHP技術者認定試験の問題集に出てきた。 ↩