読者です 読者をやめる 読者になる 読者になる

PHPのクロージャ(無名関数)

PHP5.3.0からクロージャ(無名関数)を使用できるようになっているみたいです。
PHP: 無名関数 - Manual

無名関数はクロージャとも呼ばれ、 関数名を指定せずに関数を作成できるようにするものです。 コールバック パラメータとして使う際に便利ですが、用途はそれにとどまりません。

クロージャは、変数を親のスコープから引き継ぐことができます。 引き継ぐ変数は、関数のヘッダで宣言しなければなりません。


と、文章だけではわかりにくいと思うので、コードを書くとこんな感じ。

  • 名前の無い関数を作って利用する
<?php
$func = function($v){ return $v * $v; };

echo $func(2)."\n";
echo $func(10)."\n";
?>
4
100

うーん、これだとあまりありがたみが無いですよね。

  • 無名関数を引数とする
<?php
//$arrayの各要素を$funcに従って変換します
function convert($array , $func)
{
  foreach($array as $k => $v)
  {
    $array[$k] = $func($v);
  }

  return $array;
}

$array = array(10 , 20 , 30);

//2倍にする
$a = convert($array , function($v){ return $v * 2; } );
print_r($a);

//10引く
$b = convert($array , function($v){ return $v - 10; } );
print_r($b);
?>
Array
(
    [0] => 20
    [1] => 40
    [2] => 60
)
Array
(
    [0] => 0
    [1] => 10
    [2] => 20
)

よく使われるのはこういうパターンですね。ある変数に対する操作を関数として渡して、それを基に変数を操作します。配列のソートや、コールバック関数なんかに使えます。

  • スコープが終了しても値を保持するクロージャ
<?php
//指定された値と積算する関数を作成する
function make_func($v)
{
  return function($x) use($v){ return $x * $v; };
}

$func = make_func(10);
echo $func(2)."\n";
echo $func(10)."\n";


$func = make_func(-1);
echo $func(2)."\n";
echo $func(10)."\n";
?>
20
100
-2
-10

make_func()終了後も$vの値が保持されています。これはuse($v)で値を保持することを宣言しているからです。
僕はまだこのクロージャの機能は使いこなせていないのですが、覚えておいて損はないと思います。




このクロージャ(無名関数)という機能はPHP5.3.0からの機能なので、注意してください。