PHPでクラス関数をコールバック関数に使いたい

PHPでクラス関数をコールバック関数に使いたい

今日も元気にコールバック関数使ってますか?
配列を並べ替えたりフィルタリングしたりするときには無くてはならないですよね、コールバック関数。

普通に(?)PHPのコールバック関数を書くとこんな感じになります。

$arr = array(1, 2, 3);

function double($n) {
    return $n * 2;
}

var_dump( array_map('double', $arr) );

「コールバック関数の名前を文字列で指定する」という形になります。
でもPHPにもオブジェクト指向の波が押し寄せてからは関数をクラス化してメソッドにするという流れがありますね。

class Test {
    public function double($n) {
        return $n * 2;
    }
}

$arr = array(1, 2, 3);

var_dump( array_map('Test::double', $arr) );

クラスのメソッドを指定する時はこんな感じになります。
ここまでは問題ないと思いますが、クラスのインスタンスを使う場合はちょっと注意が必要です。

class Test {
    public function double($n) {
        return $n * 2;
    }
}

$arr = array(1, 2, 3);
$test = new Test();

var_dump( array_map('$test->double', $arr) );

こんな感じで書いてみたけどこれはダメでした。
正しくは

var_dump( array_map(array($test, 'double'), $arr) );

こんな感じで配列を渡し、その第一引数にクラスのインスタンスを、第二引数にメソッド関数名を指定することで利用できます。
この配列で指定する方法はインスタンス変数だけではなく、インスタンス名も指定できるので

var_dump( array_map(array('Test', 'double'), $arr) );

このように書くこともできます。
当然ながら(PHP5.4以降なら)ショートハンドを使って書くこともできるので

var_dump( array_map(['Test', 'double'], $arr) );
var_dump( array_map([$test, 'double'], $arr) );

こんな感じの方が見やすいかもしれません。

TAG

  • このエントリーをはてなブックマークに追加
やまま
スペシャリスト やまま yamama

マンガとアニメとゲームから錬成された宇宙大好きエンジニア。 軌道エレベーターで行ける静止軌道上のコロニーに住まいを移し、ゲームやってマンガ読んでアニメ見て爆睡、ゲームやってマンガ読んでアニメ見て爆睡、という生活を夢見ながら今日もコードを書き続けるのだった。