PHP5.3の新機能『クロージャーとラムダ関数』について勉強してみる

NO IMAGE

自分はPHP以外の言語をほとんどやっていないので他の言語だとこんな感じと言われても今ひとつピンと来ません。
なので機能が追加されたらちゃんと勉強しておかないと取り残される・・・って思いがあるので勉強してみます(*ΦωΦ)

ラムダ関数

用語が入り混じっててマニュアルを見ててもわかりにくいのでまずは書き方を整理してみます((無名関数・匿名関数・ラムダ関数・ラムダ形式・クロージャー・クロージャ etc…))

普通に書く場合
~~~
1 [1] => 8 [2] => 27 [3] => 64 [4] => 125 )

~~~

create_functionを使う場合

create_function ― 匿名関数 (ラムダ形式) を作成する

~~~
無名関数はクロージャとも呼ばれ、 関数名を指定せずに関数を作成できるようにするものです。

~~~

  • 構文がよくわからない
  • ↑でみてもわかるけどエディターのシンタックスが難しい((文字列としてすべて評価しているので正しいシンタックスハイライトなんだけどみにくい・・・))
  • 実行される時に都度関数を作って評価している(らしい)
  • そんな感じだし、他の言語と書き方をそろえましたよ。ってな感じで実装されたような気がします。

    クロージャー

    PHPのマニュアル上では無名関数はクロージャとも呼ばれと書いてますが他のサイトだと分けてる感じです。

    ラムダ関数そのものによって、これまでなかったものが新たに大量に追加されるわけではありません。上で説明したように、(構文が見苦しく、パフォーマンスが理想的ではなくなりますが) すべてのことはcreate_function() を使えば可能です。しかしラムダ関数は何と言っても使い捨て関数であり、何の状態も保持しないため、できることは限られます。そこでクロージャーが登場し、ラムダ関数を次のレベルにまで高めるのです。

    やはり例がないとよくわからない・・・日本語難しい(⊃д⊂)

    ~~~
    100, “orange” => 200, “banana” => 300, “apple” => 400);
    $total = sum_includes_tax($items, 0.05);
    echo ‘TOTAL:’.$total.PHP_EOL;
    // lemon:100(5) orange:200(10) banana:300(15) apple:400(20) TOTAL:1050
    ~~~
    array_walkって配列の要素ひとつひとつに対して関数を実行するってイメージでしたがさらにそれぞれを足し算まで出来ちゃってると・・・
    すごいけどコードが読みにくくなっただけな気がして仕方がない

    ~~~
    $price) {
    echo $name.’:’.$price.'(‘.(int)($price*$tax).’)’.PHP_EOL;
    $total += ($price+(int)($price*$tax));
    }
    return $total;
    }

    $total = sum_includes_tax($items, 0.05);
    echo ‘TOTAL:’.$total.PHP_EOL;
    ~~~
    あくまでもこの例に限った話かもしれないけどこう書いた方がわかりやすいし文字数も少ないような・・・

    利用例2

    ~~~
    __invoke

    PHP5.3では、__invokeというマジックメソッドが存在する。このメソッドが定義されているオブジェクトは、メソッドとして呼び出すことができる。無名関数(クロージャ)は__invokeメソッドをもったオブジェクトなのだ。

    ~~~
    PHP V5.3 では何が新しいのか: 第 2 回 クロージャーとラムダ関数
    PHPの匿名関数(ラムダ関数) - @blog.justoneplanet.info
    無名関数(クロージャ) « PHP6.jp