《PHP8上級試験対策》マジックメソッド徹底まとめ(__call / __get / __set / __toString / __invoke)

  • URLをコピーしました!

はじめに

PHP には、特定のタイミングで自動的に呼ばれる「マジックメソッド」が用意されています。
上級試験でも頻出ですが、混同しやすいポイントが多く、誤答パターンを把握しておくことが合格への近道です。

この記事では、代表的なマジックメソッドを 一気にまとめて理解 できるよう整理しました。

キーワード: マジックメソッド / __call / __get / __set / __toString / __invoke /

目次

__call() / __callStatic()

仕組み:存在しない or アクセス不可のメソッドが呼ばれたときに実行される

class Sample {
    public function __call(string $name, array $args): mixed {
        return "Called $name with args: " . implode(',', $args);
    }
    public static function __callStatic(string $name, array $args): mixed {
        return "Static $name called";
    }
}

$obj = new Sample();
echo $obj->foo(1, 2);     // __call 発動
echo Sample::bar(9);      // __callStatic 発動

__get() / __set()

仕組み:存在しない or アクセス不可のプロパティを読み書きしたときに実行される

class Config {
    private array $data = [];
    public function __get(string $name): mixed {
        return $this->data[$name] ?? null;
    }
    public function __set(string $name, mixed $value): void {
        $this->data[$name] = $value;
    }
}

$obj = new Config();
$obj->host = "localhost";   // __set
echo $obj->host;            // __get

試験でのひっかけ

  • ❌ public プロパティにも必ず発動 → 誤り
  • ❌ 読み取り時に __set が動く → 誤り

__toString()

仕組み:

  • オブジェクトを文字列に変換しようとしたときに呼ばれる
  • 戻り値は string 型必須
class User {
    public function __toString(): string {
        return "User Object";
    }
}

$obj = new User();
echo $obj;  // "User Object"

試験でのひっかけ

  • ❌ 戻り値に mixed を返しても良い → 誤り
  • echo $obj で発動

__invoke()

仕組み:

オブジェクトを「関数のように」呼び出したときに実行される

class Multiplier {
    public function __construct(private int $factor) {}
    public function __invoke(int $value): int {
        return $value * $this->factor;
    }
}

$double = new Multiplier(2);
echo $double(10); // 20

まとめ比較表

メソッド呼ばれるタイミング試験のひっかけ
__call未定義/不可の インスタンスメソッド 呼び出し通常メソッドでも呼ばれると思いがち
__callStatic未定義/不可の staticメソッド 呼び出しインスタンスからは呼べない
__get未定義/不可の プロパティ参照publicプロパティでも発動すると誤解
__set未定義/不可の プロパティ代入読み取り時にも動くと思いがち
__toStringオブジェクトを文字列に変換mixed返却可能と思いがち
__invokeオブジェクトを関数呼び出しのように利用new時やstaticでも動くと思いがち

実務での活用例

  • __get/__set → 設定クラス、ORM での動的プロパティ管理
  • __call/__callStatic → APIラッパー、ファサードの実装
  • __toString → DTOの簡易表示、ログ出力
  • __invoke → クロージャ代替、コールバックオブジェクト、DIコンテナでの戦略注入

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

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