コールバック関数とは?どういう時に使うの?
この記事の動画版はこちら(画像クリックでYoutubeに飛びます)
コールバック関数とは?
コールバック関数とは、ある関数を呼び出す時に、引数に指定する別の関数のことです。
呼び出し元が用意した別の関数を、呼び出し先の処理の中から、呼び出し返す形になるため「コールバック」と呼ばれます。
どんな時に使うのか?
では、どんな時に使うのか?ということですが
関数は、呼び出すだけで特定の処理を行ってくれるので便利ですが、関数として一度作ってしまうと、関数の中で行われる処理は後から変えることが出来ません。
処理に必要な「材料」は引数として渡すことが出来ますが、行われる「処理の内容自体」は変えられません。
例えば、渡された配列の中身をチェックして、条件に一致するものだけを取り出してくれる関数があったとします。
この「check_array」という関数は、$before_arrayという配列データを引数として受け取り、配列の中に入っている数字を1件ずつチェックして、数字が10以上のものだけを抽出し、$after_arrayという新しい配列に入れます。
そして、その$after_arrayを返却します。
つまり、$before_arrayの中から、10以上のデータだけを取り出してくれる関数ですね。
$before_arrayにこのようにデータを入れて、check_array関数に渡すと、user1とuser3のデータだけを取り出してくれる、という訳ですね。
この関数は、呼び出すだけで配列のデータをチェックしてくれるので色々な所で使えて便利です。
しかし、「数字が10以上かどうか」ということしかチェックしてくれないため、あまり汎用的ではないです。
では、もう少し汎用的にするために「チェックしたいしきい値」を、引数で渡すように改造してみます。
しきい値を$check_numという引数として渡して、先ほど10で固定比較していた部分を$check_numに置き換えます。
このようにしておけば、チェックするしきい値は可変になるため、呼び出し方によって、様々な値をチェック出来るようになります。
例えばこのように呼び出せば、5以上のデータだけが抽出されます。
では、このようなチェックをしたい場合はどうでしょう?
このように、チェックしている条件式自体を変更しなければならないような場合は、引数だけではどうにもなりません。
関数の中の処理自体を変更するか、関数を複製して別の関数を作る必要があります。
こんな時に便利なのが「コールバック関数」です。
コールバック関数の仕組みを使えば、引数として「関数(処理)」を渡すことが出来ます。
つまり、こんな感じです。
第2引数には、通常の変数ではなく、functionで新しい関数を定義して渡しています。
この関数は、引数で受け取った$v変数を3で割り、余りが0かどうかを判定しています。
そして、呼び出される関数側は、このように改造します。
第2引数として、コールバック関数を受け取り、判定処理の部分では、このコールバック関数を呼び出します。
このように、判定処理を行っている部分を「丸々別の関数として呼び出す」ことが出来るんです。
呼び出された関数側で、呼び出し元が指定した「別の関数を呼び戻している」ため「コールバック関数」と呼ばれます。
こうしておけば、配列をループしてチェックする、といった共通処理は関数側に任せた上で、判定処理は呼び出し元で自由に指定することが出来ます。
関数を複製していくつも作ったりすることなく、1つの関数がより汎用的になる訳です。
無名関数とは?
ちなみに、コールバックとして渡している関数には「関数名」が付いていません。
これは「無名関数」と呼ばれます。
一度しか使わない「その場限りの関数」なので、あえて名前を付ける必要もなく、こういった場合は無名関数として定義することができます。
JavaScriptではよく使われる手法ですね。
まとめ
コールバック関数を使用すると、関数をより汎用的にすることが出来ます。
ただし、汎用性が上がる反面、ソースコードの処理を追いかけづらくなってしまうデメリットもあるので、必要に応じて使うようにしましょう。
また、PHPの標準関数や、JavaScriptの非同期処理などを使う場合は、コールバック関数を指定しなければならない場合も多いので、コールバック関数がどういうものなのかということはしっかり理解しておきましょう。