最近のお気に入り「コールバック関数」
最近コールバック関数がお気に入りだ。おそらく使わなくてもいいような関数ではあるのだが、使うことでスクリプトがすっきりするからだ。
例えば、ある配列が以下のように定義されているとする。
$myArray=array(
[0]=>array(‘a’,’b’),
[1]=>array(‘c’,’d’),
[2]=>array(‘e’,’f’),
[3]=>array(‘g’,’hb’),
:
:
);
この配列のそれぞれの値について処理をする方法を考える。まず通常はforeachなどでループ処理を書けばよい。
foreach($myArray as $myValue){
//処理1
}
ここに別の要素が加わるとする。例えば別の変数があり、その変数の値がtrueなら処理1を、falseなら処理2をさせるとする。プログラムを羅列するとこんな風になる。
if($flag){
foreach($myArray as $myValue){
//処理1
}
}else{
foreach($myArray as $myValue){
//処理2
}
}
これはいかにも冗長だ。しかしコールバック関数を使うときれいなプログラムがかける。
$funcName=($flag ? ‘proc1′:’proc2′);
array_walk($myArray,$funcName);
function proc1{
//処理1
}
function proc2{
//処理2
}
まぁ、どちらが美しいかというのは、人それぞれの感性によるものだからなんともいえないのだが、個人的には後者のプログラムのほうがすっきりしているように見える。array_walkという関数が難しければ、こんなふうにもかける。
$funcName=($flag ? ‘proc1′:’proc2′);
foreach($myArray as $myValue){
call_user_func($funcName,$myValue);
}
function proc1{
//処理1
}
function proc2{
//処理2
}
要は関数名そのものを変数に格納し、その変数を読むことによって、希望する関数を呼び出す、ということ、になる。
あまりコールバック関数ばかり使うと、逆にプログラムが読みにくくなってしまう可能性も無きにしも非ずだが、適度に利用することで、すっきりしたプログラムが書けるようになる。
今まで使えなかった機能をつけるようになるというのは、少し楽しい。