しばらく前(と言っても確か今年)、PHP開発者MLにクロージャーがその場で呼び出せないのは不便だ、と書いた事があるのですが知らない間に追加されていました。
クロージャーをその場で呼び出すのはクロージャーを()で括って、関数のようにすればその場で実行されます。
<?php
(function() {
echo 'hello';
})();
とすると
hello
が出力されます。(PHP 5.6などでは構文エラー)returnで戻り値を返せば普通に使えます。
<?php
echo (function() {
return 'hello';
})();
これも戻り値として返って来たhelloを出力します。
hello
便利になりました。
PHP 7.1用にはクロージャーの短縮表記が提案されていて、これは微妙かも、と思ったのですが意外に開発者MLでは好評です。PHP 7.1からは
function ($x) {
return $x * 2;
}
は
$x ~> $x * 2
と書けるようになるかも知れません。他の言語を見ると似たような構文は沢山実装されています。
HackLang: ($x) ==> $x + 1;
C++: [](int x) -> int { return x + 1; }
Java: (int x) -> x + 1;
Python: lambda x: x+1
Ruby: lambda |x| { x + 1 }
Rust: |x| x + 1
JavaScript (ES6): x => x + 1
C#: x => x + 1
Objective C: ^(int x) { return x + 1; }
構文の仕様がPHP的でないのでどうなるか判りませんが、もしかすると短縮表記クロージャーがPHP 7.1から利用できるかも知れません。
忙しい時はPHP開発MLを読んでいないので議論はあったのだと思います。しかし、UPGRADINGに記載がないのは問題ですね。
追記:コードから考えてみるとUniform Variable Syntaxで使えるようになったと思います。なので正確には記載がない訳ではないですね。