はじめに
PHP のマジックメソッド __set()
と __get()
は、未定義またはアクセスできないプロパティへのアクセス時に動作します。ただし、この挙動には 「インスタンスプロパティ」と「静的プロパティ」 で大きな違いがあります。この記事では、試験問題で混乱しやすいポイントを図解で整理します。
目次
基本ルール
__set($name, $value)
→ 存在しない or アクセス不能な「インスタンスプロパティ」に値を書き込むときに実行される。
__get($name)
→ 存在しない or アクセス不能な「インスタンスプロパティ」を読み込むときに実行される。
⚠️ 重要:静的プロパティ (Hoge::$prop
) には効かない
実際のコード例
<?php
declare(strict_types=1);
error_reporting(-1);
class Hoge{
public function __set(string $name, mixed $value): void {
var_dump(__METHOD__, $value);
}
public function __get(string $name): mixed {
var_dump(__METHOD__, $name);
return null;
}
}
$obj = new Hoge();
// インスタンスプロパティ
$obj->num = 10; // __set() が呼ばれる
var_dump($obj->num); // __get() が呼ばれる
// 静的プロパティ
Hoge::$name = 'hello'; // Fatal error
実行結果
string(11) "Hoge::__set"
int(10)
string(11) "Hoge::__get"
string(3) "num"
NULL
Fatal error: Uncaught Error: Access to undeclared static property Hoge::$name
図解で理解する
インスタンスの場合
$obj->num = 10;
│
▼
__set("num", 10) が呼ばれる
var_dump($obj->num);
│
▼
__get("num") が呼ばれる
静的プロパティの場合
Hoge::$name = "hello";
│
▼
マジックメソッドは呼ばれない!
▼
Fatal error
試験での誤答パターン
- ❌ 「静的アクセスでも
__set
/__get
が呼ばれる」 → 誤り - ⭕ 「インスタンスアクセスのみ有効、静的はエラーになる」 → 正解
まとめ
__set
/__get
は インスタンスプロパティ専用- 静的プロパティアクセスでは Fatal error になる
- 試験では「静的でも呼ばれる」と思い込むミスがよく出るので要注意!