無名関数/クロージャ基礎

今回は無名関数についてです。phpのパージョン5.3以降から使えるようになりました。
むしろ無名関数がなんで使えなかったのが不思議なくらいでしたからね。

さて、無名関数って何?って思われる方もいらっしゃるので簡単に説明をします。
まあ、書いて字のごとく無名の関数なんです。


スポンサーリンク



単純に一回だけしか使わないよとか何回も使わないものに名前を書いていくとかぶっちゃう可能性があるのでこの無名関数を使ってスッキリとしちゃいましょう~
因みに無名関数ってcreate_function()というものがありましたが、、、使えないですよね~、create_function()は調べてみてください。

無名関数

無名関数は実際どういうものかといいますと

1
2
3
4
5
6
$triangle = function($a, $b) {
            $area = $a * $b / 2;
			  return $area;
		  };
echo $triangle(5, 6);
?>

こんな感じや

1
2
3
4
5
6
7
<?php 
$sum = function($a) {
	    return  array_sum($a);
};
$num = array(130, 270, 500, 680, 20);
echo $sum($num);
?>

こんな感じですね、すごくすっきりしますねー。
見た感じだと変数を関数化している感じですかね~。
これ楽ですわ~。

クロージャ

それからクロージャっていうものが存在しますがマニュアルにはなぜか同じように書かれていますよね。
無名関数(クロージャ)というように。
実際、ちょっと違います。
クロージャって関数の中に関数を作ることができて、元関数の変数が中関数でも使えるといっても伝わりにくいので
実際例を見てみます。

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php 
 
function triangle_doble($a, $b) {
		      $area = $a * $b / 2;
			  return function ($times = 2) use ($area) {
				              return $area * $times;
							  };
				};
 
$f = triangle_doble(5, 6);
echo $f();
 
?>
1
2
3
4
5
6
7
8
9
10
11
<?php function sum_tax($a) {
	      $total = array_sum($a);
		  return function($tax = 0.05) use ($total) {
			 $add = $total * $tax;
			 return floor($add + $total);
	  };
	}
$num = array(130, 270, 500, 680, 20);
$f = sum_tax($num);
echo $f();
?>
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
$f = function($times = 2) {
	return function($v) use ($times) {
		return pow($v, $times);
	};
};
$cube = $f(3);
echo $cube(1) . '<br>';
echo $cube(2) . '<br>';
echo $cube(4) . '<br>';
echo $cube(8) . '<br>';
 
?>

という風に使うことができます。便利ですよね~。

マジックメソッド__invoke

実は同じように5.3で追加された機能でマジックメソッドのinvokeもクロージャっぽく振る舞うことができちゃいます。

1
2
3
4
5
6
7
8
9
10
11
12
<?php
class invoken {
	public $num = 5;
	public $num2 = 10;
    public function __invoke($num3 = 3){
        echo $this->num * $this->num2 * $num3;
    }
}
$closure = new invoken();
$closure(5);
 
?>

いろいろと使い道ありそうなので覚えておきましょう~。

Pocket
LINEで送る


スポンサーリンク

コチラの記事もどうぞ!
You can leave a response, or trackback from your own site.

コメントをお寄せ下さい

Subscribe to RSS Feed Follow me on Twitter!