はじめに
PHP には、特定のタイミングで自動的に呼ばれる「マジックメソッド」が用意されています。
上級試験でも頻出ですが、混同しやすいポイントが多く、誤答パターンを把握しておくことが合格への近道です。
この記事では、代表的なマジックメソッドを 一気にまとめて理解 できるよう整理しました。
目次
__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コンテナでの戦略注入