《PHP8上級試験対策》配列形式コールバックでクラスメソッドを呼び出す方法

  • URLをコピーしました!

はじめに

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など)でも頻出です。イベント処理やルーティングで「コールバック配列」が出てきても、もう迷いませんね!

この記事が気に入ったら
いいねしてね!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次