PHP7からクロージャーの即時呼び出しが可能に

9月 2, 2015 Programming
(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で使えるようになったと思います。なので正確には記載がない訳ではないですね。

投稿者: yohgaki