PHP
基礎

PHPでコールバック関数を利用する

More than 3 years have passed since last update.

PHPを再勉強中。

JavaScriptをはじめ最近プログラムを書くときに何かと使う機会が多いコールバック関数。
PHPでのコールバック関数の使い方をまとめてみました。

可変関数を利用する方法

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

参照:可変関数

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

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

# 関数をコールバック関数として渡す
func("callback_func");  # <= "callback function result :foo" と出力

コールバック関数を渡すさい、名前を文字列で指定するというトコがミソでしょうか?

call_user_func() 関数を利用する方法

可変関数を利用したコールバック関数には一つ問題があって、クラスやオブジェクトのメソッドをコールバック関数として渡すことができません。
クラスやオブジェクトのメソッドをコールバック関数として渡すには、call_user_func()関数を利用すると良いようです。

参照:call_user_func

call_user_func() の第1引数には呼び出したいコールバック関数を渡します。通常の関数であれば可変関数と同じく、関数の名称を文字列で渡します。
オブジェクトのメソッドの場合は、配列を用い0番目の要素にオブジェクト自身、1番目の要素に呼び出したいメソッドの名称を文字列で渡します。呼び出したいメソッドがクラスの静的メソッドの場合、配列の0番目の要素にクラス名を文字列で渡します。

参照:コールバック

<?php
# クラスの定義
class MyClass
{
    function callbackMethod()
    {
        return "hoge";
    }
    static function staticCallbackMethod()
    {
        return "fuga";
    }
}

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

#メソッドをコールバック関数として渡す。
$obj = new MyClass();
func(array($obj, "callbackMethod"));      # <= "callback function result :hoge"と出力

# 静的メソッドのをコールバック関数として渡す。
func(array("MyClass", "staticCallbackMethod"));  # <= "callback function result :fuga"と出力

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

PHP5.3から無名関数を使うことができるようです。

参照:無名関数

<?php

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

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

無名関数の定義は通常の関数の定義から関数名を省略したもの。関数オブジェクト?が返るので変数に代入したり、関数やメソッドの引数として渡すことができます。
実行するにはcall_user_func()を利用するか、代入された変数に可変関数のように()を付与することでも呼び出すことができます。

<?php
# 変数に代入した無名関数を呼び出す。
$func = function() { return "foo"; };
echo $func() . PHP_EOL;  # <= "foo"と出力される。

タイプヒンティング

PHP5.4以降では関数やメソッドの引数定義時にタイプヒンティングを使用することができます。タイプヒンティングにcallableを指定することで引数がコールバック関数であることを明示することが可能です。

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