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

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

ラムダ関数

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

普通に書く場合

create_functionを使う場合

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

ラムダ関数を使う場合

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

これだけだと単純にコールバック関数がjavascriptっぽく書ける様になったっていう印象を受けました((読みやすくはないからあまり好きではないけど・・・))
とはいえ今までcreate_functionで出来ていたのに新しく機能を追加したのはなんでなんだろう??

create_functionの弱点

  • 構文がよくわからない
  • ↑でみてもわかるけどエディターのシンタックスが難しい((文字列としてすべて評価しているので正しいシンタックスハイライトなんだけどみにくい・・・))
  • 実行される時に都度関数を作って評価している(らしい)

そんな感じだし、他の言語と書き方をそろえましたよ。ってな感じで実装されたような気がします。

クロージャー

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

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

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

急にuseが現れて書き方もちょっとかわりました。

エラーが出ちゃいました(´・ω・`)

こうすれば動きました。
結果は同じになっちゃったけどなにか理解が間違ってるような気が
いまいち違いとメリットがわからない・・・・

利用例

array_walkって配列の要素ひとつひとつに対して関数を実行するってイメージでしたがさらにそれぞれを足し算まで出来ちゃってると・・・
すごいけどコードが読みにくくなっただけな気がして仕方がない

あくまでもこの例に限った話かもしれないけどこう書いた方がわかりやすいし文字数も少ないような・・・

利用例2

なんだ・・・なにが起きてるのかわからない・・・

この関数の中身ってこういう感じなのかなぁ

__invoke

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

完全に理解の範疇をこえた感じがします。。

というわけで今更ながら勉強してみましたがjavascriptで触っているラムダ関数以外の使い方や意味がよくわからず。。。
lithiumを見てもまだまだ実際に使っている箇所もあまりないようですし実際どういうときに使うとこれすげーってなるのか更なる研究が必要という結論なのでした。
常に先生を募集しています、突っ込み大歓迎ですのでよろしくお願いいたします(*ΦωΦ)

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

スポンサーリンク

シェアする

フォローする

コメントを残す

トップへ戻る