16
16

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

PHP7調査(28)関数適用やメソッド呼び出しなどのネストをサポート・整理

Posted at

PHP5までは、関数適用などを組み合わせた文を書くとエラーになることがありました。例えば次のような文はPHP5では不正ですが、PHP7から正しい文になります。

<?php
function foo() {
    return function () {
        var_dump(123);
    };
}
foo()(); // PHP7で動く、PHP5ではエラー

また、カッコで囲った任意の式に対して関数適用やメソッド呼び出し・配列アクセスなどができるようになりました。難しい式を書いたときなど、読みやすくできるのは良いですね。

<?php
Class Foo
{
    static public function bar() {
        new Foo();
    }
    public function baz() {
        var_dump(123);
    }
}
(Foo::bar())->baz(); // PHP7で動く、PHP5ではエラー

特に、無名関数をその場で呼び出せるようになったのは進歩かなと思います。ようやく他の言語に追いついた感がありますね。

<?php
// PHP7で動く、実用的かどうかは疑問
foreach ((function ($x) { while (1) { yield $x++; } })(100) as $v) {
    var_dump($v);
    if ($v == 105) break;
}
/*
int(100)
int(101)
int(102)
int(103)
int(104)
int(105)
*/

ちなみに、この手の改善は今までのPHPでも行われています。次のようにPHP5.4やPHP5.5で書けるようになった表現もあります。念のため。

<?php
Class Foo
{
    public function bar() {
        var_dump(123);
    }
}
(new Foo())->bar(); // PHP5.4以降で動く:int(123)
var_dump(range(0,5)[4]); // PHP5.4以降で動く:int(5)
var_dump(['foo','bar'][1]); // PHP5.5以降で動く:string(3) "bar"

参照

16
16
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16
16

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?