(Last Updated On: 2018年8月8日)
しばらく前(と言っても確か今年)、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で使えるようになったと思います。なので正確には記載がない訳ではないですね。
Leave a Comment