PHPでクロージャ

試してみた。

<?php
function c(){
    $x = 1;
    return function () {
        print $x++."\n";
    };
}
$func = c();
$func();
$func();

と書くと

PHP Notice:  Undefined variable: x in file line x

で変数のxのスコープが当たらない。
なるほどuse句を使うのか

<?php
function c(){
    $x = 1;
    return function () use($x) {
        print $x++."\n";
    };
}

実行

1
1

あれ、変数がそのまま値渡しになっている。

こーするのか。

<?php
function c(){
    $x = 1;
    // use ( &reference )
    return function () use(&$x) {
        print $x++."\n";
    };
}
1
2

以上。