(PHP) コールバック関数とは?使い方を分かりやすく解説

(PHP) コールバック関数とは?使い方を分かりやすく解説

 

PHPでのコールバック関数の使い方をまとめた。
コールバック関数はJavaScriptなどでも使用されており、web系の開発をする人は知っておくと便利なので、絶対に押さえておこう。

 

コールバック関数とは

コールバック関数とは、ある関数を呼び出す時に、引数に指定する別の関数のことだ。

コールバック関数の画像

呼び出し元が用意した別の関数を、呼び出し先の処理の中から、呼び出し返す形になるため「コールバック」と呼ばれる。何気にこの概念を理解するのにかなり時間がかかったので、しっかりと押さえてもらいたい。

 

コールバック関数を使用したサンプル

実際にコールバック関数を使用したサンプルを見て欲しい。

呼び出し元は、引数に$functionから始まる無名関数をコールバック関数として渡しており、呼び出し先では、受け取ったコールバック関数を処理内で実行(コールバック)している。

$array = [ 15, 7, 8, 102, 0 ];

# 呼び出し元
$result = checkCanDevide($array, $function ($v) {   # 引数にコールバック関数を指定
    if ($v % 3 === 0) {
        return $v;
    }
});

# 呼び出し先
function checkCanDevide($array, $callback_function) {
    $retArray = [];
    foreach ($array as $num) {
        if ($callback_function($num) {          # 引数のコールバック関数を実行(コールバック)
            $retArray[] = $num;
        }
    }
    return $retArray;
}

上記の何がメリットかと言うと、呼び出し先の関数はコールバック関数を引数として受け取って実行するだけで良いので、より汎用性が高まると言う点にあるだろう。コールバック関数の処理内容は呼び出し元で何とでも変えて良くて、呼び出し先はあくまで「引数に関数が渡ってくる」ことだけを意識しておけば良いため、呼び出し先の関数を無駄にパターンを作成すると言った心配がなくなる。

 

コールバック関数とは
  • ある関数を呼び出す時に、引数に指定する別の関数のこと
  • 呼び出し元が用意した別の関数を、呼び出し先の処理の中から、呼び出し返す形になるため「コールバック」と呼ばれる
  • 呼び出し先の関数はコールバック関数を引数として受け取って実行するだけで良いので、より汎用性が高まる

 

より深いPHPのコールバック関数の理解

上記まででPHPのコールバック関数がざっくり理解できたかと思う。
ここからはより深くコールバック関数を理解するパートとする。

 

可変関数

PHPには可変関数という仕組みがある。
これは変数名の後ろに()を付与することで、変数の値と同名の関数を呼び出すことができるというものだ。この機能を利用することでコールバック関数を実現することができている。

<?php

# コールバック関数
function callback_func()
{
    return "foo";
}

# コールバック関数を受け取る関数
function func($callback)
{
    # 可変関数を利用して文字列で渡された名称の関数を呼び出す。
    echo "callback function result :" . $callback() . PHP_EOL;     #変数の後ろに()を付けてコール
}

# 関数をコールバック関数として渡す
func("callback_func");

コールバック関数を渡す際は、名前を文字列で指定する(もちろん後ろの()は省略して)と言う点がポイントとなる。

 

可変関数とは
  • 変数名の後ろに()を付与することで、変数の値と同名の関数を呼び出すことができるというもの
  • コールバック関数を渡す際は、名前を文字列で指定する。

 

参照:可変関数

 

call_user_func() 関数を利用して、クラスやオブジェクトメソッドをコール

可変関数を利用したコールバック関数には一つ問題がある。
それはクラスやオブジェクトのメソッドをコールバック関数として渡すことができないことだ。

そこで、クラスやオブジェクトのメソッドをコールバック関数として渡すには、
call_user_func()関数を利用することができる。

例として、オブジェクトのメソッドをコールする場合で説明する。

オブジェクトのメソッドをコールする場合(call_user_func())
  • 通常のクラスメソッドをオブジェクトからコール場合、call_user_func()の引数に配列を用いる。0番目の要素にはオブジェクト自身、1番目の要素に呼び出したいメソッドの名称を文字列で渡す。
  • 静的クラスメソッドを呼び出したい場合も、call_user_func()の引数に配列を用いる。配列の0番目の要素にクラス名を文字列で渡し、1番目の要素に呼び出したいメソッドの名称を文字列で渡す。

 

<?php

# サンプルクラス
class SampleClass
{
    # 普通のクラスメソッド
    function callbackMethod()
    {
        return "hoge";
    }

    # 静的クラスメソッド
    static function staticCallbackMethod()
    {
        return "fuga";
    }
}

#コールバック関数を受け取る関数
function func($callback)
{
    echo "callback function result :" . call_user_func($callback) . PHP_EOL;
}

# 普通のクラスメソッドをコール
$obj = new SampleClass();
func(array($obj, "callbackMethod"));                    #hoge

# 静的メソッドをコール
func(array("SampleClass", "staticCallbackMethod"));         #fuga

 

参照:call_user_func

 

無名関数をコールバックで渡す。

PHP5.3から無名関数を使うことが可能(既に冒頭の例でしれっと使用したけど)。

<?php

#コールバック関数を受け取る関数
function func($callback)
{
    echo "callback function result :" . call_user_func($callback) . PHP_EOL;
}

# 無名関数をコールバック関数として渡す。
func(function() { return "bar"; });

無名関数とは、通常の関数の定義から関数名を省略したもの。
関数オブジェクト?が返るので変数に代入したり、関数やメソッドの引数として渡すことが可能となる。

実行するにはcall_user_func()を利用するか、代入された変数に可変関数のように()を付与することでも呼び出すことができる。

<?php

# 変数に代入した無名関数を呼び出す。
$func = function() { return "foo"; };

echo $func() . PHP_EOL;

 

参照:無名関数

 

タイプヒンティング

PHP5.4以降では関数の引数定義時にタイプヒンティングを使用することが可能だ。

タイプヒンティングにcallableを指定することで引数がコールバック関数であることを明示することが可能となる。

<?php

# タイプヒンティングで引数がコールバック関数であることを明示する。
function func(callable  $callback)
{
    echo "callback function result :" . call_user_func($callback) . PHP_EOL;
}

 

型を意識しなくても済むPHPで、callbleのような型(のようなもの)を記述するのは面倒と思うかもしれないが、型を限定することは思わぬバグを未然に防ぐことにつながるメリットがあるので覚えておこう。

 

 

 

記事が気に入った方はシェアをお願いします!

コメントを残す

メールアドレスが公開されることはありません。