Perl日記

PerlとかRubyとかPHPとかPythonとか

PHPで関数を返す関数を呼んで関数を呼びたかった(即時実行)

関数を返す関数を変数に入れて、直接呼びたい。

<?php

$f = function ($x) {
    return function ($y) use ($x) {
        return $x + $y;
    };
};

echo $f(123)(234); //=> 357

PHP7

問題なし。

PHP5.6

syntax error, unexpected '('

怒られた。

他の動かない例

括弧したり変数に入れたり。

<?php

echo ($f(123))(234); // syntax error, unexpected '('

echo ($f2 = $f(123))(234); // syntax error, unexpected '('
動いた例

変数に一旦入れた後、改めて呼べばいいんだけど、なんだか悔しい。

<?php

$f2 = $f(123);
echo $f2(234);

先輩PHPerからの教えによれば__invoke()を使えばいいとのこと。

<?php

echo $f(123)->__invoke(234);

なるほど。(よくわからないけど動いた感)

見た目があれだけど、call_user_func()でも動くらしい。

<?php

echo call_user_func($f(123), 234);