PHPでの無名関数

無名関数は、クロージャとも呼ばれており、通常は関数は名前を付けて呼び出しますが、無名関数は名前をつけなくても呼び出すことができます。
関数に渡す別の関数をコールバック関数と呼ばれていますが、無名関数を使うとこのコールバックがとても便利になります。そうとはいっても、あらゆるソースを見てきましたが、あまり使っている場面を見かけないのも事実です。
無名関数の使い方はソースを見てなんとなくわかる気がするのですが、ロジックを理解するのに頭の中がこんがらがってしまうという人もいます。そういう人のためにも、ここでは無名関数について基本的な知識を説明しておきます。

まずは無名関数の基本的な使い方です。


$a = function($value){
	echo $value."です";
};

$a("テスト");

結果:テストです

変数を入れたい場合は以下のようにuseをつかいます。


$message = "こんにちは";

$b = function() use ($message) {
	echo $message;
};

$b();

結果:こんにちは

値を代入して変数を入れる場合。


$message = "こんにちは";

$c = function($value) use ($message) {
	echo $message." ".$value."さん";
};

$c("太郎");

結果:こんにちは 太郎さん

値を代入して変数を入れて計算式を入れてみた場合。


$price = 5000;
$tax = 0.1; // 10%

$d = function($product,$num) use ($price,$tax) {
	$sub_total_price = $price * $num;
	$total_price = $sub_total_price + ($sub_total_price * $tax);
	
	echo $product."が".$num."個で、";
        echo "合計が".number_format($total_price)."円(税込)となります";	
};

$d("ハードディスク",2);

結果:ハードディスクが2個で、合計が11,000円(税込)となります

個数と値を入れて合計金額だけをreturnして返してみる使い方。


$price = 5000;
$tax = 0.1;

$e = function($num) use ($price,$tax) {
	$sub_total_price = $price * $num;
	$total_price = $sub_total_price + ($sub_total_price * $tax);
	return $total_price;
};

$num = 3;
echo "ハードディスクが".$num."個で、";
echo "合計が".$e($num)."円(税込)となります";	

結果:ハードディスクが3個で、合計が16500円(税込)となります

応用すればコールバック関数、無名関数というこういう使い方もできます。(3の倍数だけ取得)


function array_check($array_b,$callback){
	$array_a = [];
	foreach($array_b as $k => $v){
		if($callback($v)){
			$array_a[$k] = $v;
		}
	}
	
	return $array_a;
}

$arr = [
	'user1' => 15,
	'user2' => 3,
	'user3' => 20,
	'user4' => 8,
	'user5' => 5,
	'user6' => 24,
	'user7' => 19,
	'user8' => 21,
	'user9' => 13,
	'user10' => 11,
];

$check = array_check($arr,function($v){
	return $v % 3 === 0;
});

var_dump($check);

結果:array(4) { ["user1"]=> int(15) ["user2"]=> int(3) ["user6"]=> int(24) ["user8"]=> int(21) }

今回はあえて、ソースを見ていただいて書き方を覚えてもらおうと説明を省かせていただきました。見たほうが早いというのもありますので・・・
たしかに無名関数は便利なのですが、好む人もいれば好まない人もいるようで、個人的には使わないのであれば、それでもいいとは思います。ただ、基本的な部分での使い方はしなくても、ある場面で無名関数を使うと便利だと思う事がときどきあります。使う、使わないは別としても覚えておいて損はないかと思います。