クロージャ
クロージャとは関数の一種で,
クロージャは関数がアクセス可能な変数が,
クロージャの使い方
クロージャはラムダ関数,
クロージャに慣れていない方は,
クロージャの構文は次のように,
- 無名関数の構文
- function( [ 引数 ] ... ) { 文 };
PHP以外の言語では,
無名関数の中から無名関数が実行されるスコープ内の変数を使用する場合には,
- use文を利用する場合の無名関数の構文
- funciton( [ 引数 ] ... ) use ( [ 変数 ] ... ) { 文 };
多少面倒に思うかも知れませんが,
無名関数は関数名が無いので,
例:無名関数を変数から利用する
<?php
$writeline = function($msg) { echo $msg.PHP_EOL; };
$writeline('ABC');
$writeline('XYZ');
?>
出力
ABC XYZ
これだけでは何が便利なのかさっぱり分からないですが,
function($msg) { echo $msg.PHP_EOL; };
の部分が無名関数の定義です。無名関数は直接パラメータとしてほかの関数に渡すことが出来ます。
例:無名関数を利用してarray_
<?php
$fruits = array("lemon"=>156, "orange"=>210, "banana"=>180, "apple"=>343);
array_walk($fruits,function($price,$name) { echo $name.':'.$price.PHP_EOL; });
?>
出力
lemon:156 orange:210 banana:180 apple:343
無名関数が無いPHP 5.
function($price,$name) { echo $name.':'.$price.PHP_EOL;}
を別の関数として定義した上で,
例:無名関数を利用しない方法
<?php
$fruits = array("lemon"=>156, "orange"=>210, "banana"=>180, "apple"=>343);
function callback($price,$name) { echo $name.':'.$price.PHP_EOL; }
array_walk($fruits,'callback');
?>
あまり,
無名関数を使うと,
例:処理を無名関数として渡す
<?php
$square = function($x) { return ($x * $x); };
$increment = function($x) { return ++$x; };
function foo($param, $op) {
return $op($param);
}
echo foo(3, $square) . PHP_EOL;
echo foo(4, $increment) . PHP_EOL;
?>
変数関数に書き換えると次のようになります。
例:変数関数の場合
<?php
function square($x) { return ($x * $x); }
function increment($x) { return ++$x; };
function foo($param, $op) {
return $op($param);
}
echo foo(3, 'square') . PHP_EOL;
echo foo(4, 'increment') . PHP_EOL;
?>
どちらも全く同じことができますが,
‘square_