LoginSignup
3
1

More than 5 years have passed since last update.

クロージャの変数値はいつ束縛されるか

Last updated at Posted at 2018-10-30

何が出力されるでしょうか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でクロージャを使うメリットがわかりません。
というか、実はそれ以前に、冒頭のコードは関数ではなく実行結果を返しているのでクロージャですらありません。
何がしたかったんだこのコード。


  1. PHP技術者認定試験の問題集に出てきた。 

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1