濃縮還元オレンジニュース

PHP 5.3の無名関数を試してみた

この記事を読むのに必要な時間:およそ 0.5 分

現時点は正式リリースしていないPHP 5.3の一機能である,無名関数を試したレポート記事です。PHPの公式サイトより開発版をインストールして試しています。

PHP 5.2以前ではcreate_functionという似たような機能を持つ関数がありますが,記述がとても冗長で可読性が低かったり,実際には内部的に関数名を持っていてループなどで複数回コールするとその分だけ関数が生成されメモリを多く消費してしまったりなど,あまり評判が良くありません。しかしPHP 5.3の無名関数の導入によって,JavaScriptのようにすっきりと記述できます。

例として,配列の各要素に対して処理を行えるarray_mapを使ってみます。

通常の記述ではリスト1のようになります。

同じ処理をcreate_functionを使って表すとリスト2のようになります。create_functionを使うと関数を別途定義しなくて済みますが,処理内容を引用符で囲まないといけないため,処理が長くなると非常に見づらくなります。

最後にPHP 5.3の無名関数を使った例をリスト3に示します。JavaScriptをよく書く人にとっては,とても馴染みのある文法で書くことができます。無名関数は実際にはClosureという内部クラスで表現されているようです。

ブログ記事ではほかにも,JavaScriptのcurryを書き直したサンプルや,array_walkのサンプルなど多くのコードが載せてあります。

リスト1 通常のコード

function cube($n)
{
    return ($n * $n * $n);
}

$a = array(1, 2, 3, 4, 5);
$b = array_map('cube', $a);
print_r($b);

リスト2 create_functionを使ったコード

$a = array(1, 2, 3, 4, 5);
$b = array_map(create_function('$n', 'return ($n * $n * $n);'), $a);
print_r($b);

リスト3 無名関数を使ったコード

$a = array(1, 2, 3, 4, 5);
$b = array_map(function($n) {
                  return ($n * $n * $n);
               }, $a);
print_r($b);

URLhttp://nonn-et-twk.net/twk/php5.3-lambda

著者プロフィール

角田直行(かくだなおゆき)

普段はお仕事でPHPやJavaを使ってWeb開発をしています。一部でセレブエンジニアとか言われてますが,全然セレブじゃありません。

コメント

コメントの記入