はじめに
PHPを書いていると、[Hoge::class, 'foo']
のような配列を「関数のように」実行しているコードを見かけることがあります。最初は「なんで配列を関数みたいに呼べるの?」と不思議に思いますよね。
この記事では、サンプルコードをもとに コールバック配列の仕組み を解説します。
目次
サンプルコード
ソースコード
<?php
declare(strict_types=1);
error_reporting(-1);
class Hoge{
public static function foo(){
echo __METHOD__ , "<br>";
}
public function bar(){
echo __METHOD__ , "<br>";
}
}
$f = [Hoge::class, 'foo'];
$f();
$f2 = [new Hoge(), 'bar'];
$f2();
出力結果は以下のとおりです:
Hoge::foo
Hoge::bar
コード解説
マジック定数 __METHOD__
__METHOD__
は「現在実行中のメソッド名」を返すマジック定数です。
Hoge::foo
Hoge::bar
のように出力されます。
静的メソッドをコールバックで呼ぶ
$f = [Hoge::class, 'foo'];
$f();
Hoge::class
はクラス名を文字列"Hoge"
として返します。- 結果として
["Hoge", "foo"]
という配列が作られます。 - これを関数のように
$f();
と呼ぶと、Hoge::foo()
が実行されます。
出力結果
Hoge::foo
インスタンスメソッドをコールバックで呼ぶ
$f2 = [new Hoge(), 'bar'];
$f2();
- ここではオブジェクト
new Hoge()
を配列に入れています。 - 結果として
[Hogeのインスタンス, "bar"]
という形になり、$f2();
でHoge::bar()
が実行されます。
出力:
Hoge::bar
なぜ配列でコールバックできるのか?
PHPには 「コールバック関数」 という仕組みがあります。
これは「関数やメソッドを文字列や配列で表現し、あとから実行できる」というものです。
関数をコールバックにする場合
call_user_func('strlen', 'hello'); // 5
メソッドをコールバックにする場合
- 静的メソッド →
['クラス名', 'メソッド名']
- インスタンスメソッド →
[$オブジェクト, 'メソッド名']
例:
class Sample {
public static function staticMethod() {
echo "static method\n";
}
public function instanceMethod() {
echo "instance method\n";
}
}
call_user_func(['Sample', 'staticMethod']); // static method
call_user_func([new Sample(), 'instanceMethod']); // instance method
そして $f();
のように直接呼ぶ書き方は、実は call_user_func($f);
の省略記法です。
まとめ
- 配列形式のコールバックは
[クラス名, 'メソッド名']
または[オブジェクト, 'メソッド名']
の形をとる $変数();
で関数呼び出しと同じように実行可能__METHOD__
を使うと「どのメソッドが呼ばれたか」を確認できる
この仕組みはフレームワーク(Laravel, Symfonyなど)でも頻出です。イベント処理やルーティングで「コールバック配列」が出てきても、もう迷いませんね!