Edited at

PHPの [$obj, "someMethod"] の意味


おまけ

なぜか最初におまけを書きます

メソッドを動的に呼び出したり、コールバックとして引数に渡したいときは、今回紹介する方法ではなくリフレクションを使ったほうがわかりやすいかもしれません。

記事を書いた目的は私がなんとなく気になっただけです。


本題

たとえばこんな関数があったとして

function doSomeTask($callback) {

// ...

$callback();
}

なにか適当な処理を実行してコールバックを実行するものです。

doSomeTask(function() {

echo "hogehoge";
});

上記のように匿名関数を渡すときは簡単ですが、インスタンスのメソッドを渡したいときはどうするのでしょうか。

// $personのクラスにgreetっていうメソッドがある設定

doSomeTask($person->greet);

上だとエラーになってしまいます。

どうすればいいのかというと、こうすればいいのです。

doSomeTask([$person, "greet"]);

これだとうまく動作します。


なぜこれで動くのか

インスタンスとメソッド名を渡すだけで、なんで$callback();を実行できるの?

答えは可変関数というPHPの機能です。

PHP: 可変関数 - Manual


これにより、変数名の後に括弧が付いている場合、その値が何であろうと PHPは、同名の関数を探し実行を試みます。


以下のようなコードでは$func"doHoge"という文字列だから、doHoge()を実行するということですね。スクリプト言語ではよくある仕様じゃないかと思います。

$func = "doHoge";

$func();

その可変関数の機能の一つとしてインスタンスのメソッドを呼び出せるのです。

それが配列の形式です。


class Foo

{
function baz()
{
echo "baz\n";
}
}

$func = array(new Foo, "baz");
$func(); // "baz"を表示します。


配列の[0]にインスタンス、[1]にメソッド名をいれて、それを関数のように呼び出せば、メソッドが実行されるというわけです。