《PHP8上級試験対策》__set() と __get() の正しい挙動:インスタンスと静的プロパティの違い

  • URLをコピーしました!

はじめに

PHP のマジックメソッド __set()__get() は、未定義またはアクセスできないプロパティへのアクセス時に動作します。ただし、この挙動には 「インスタンスプロパティ」と「静的プロパティ」 で大きな違いがあります。この記事では、試験問題で混乱しやすいポイントを図解で整理します。

キーワード: __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 になる
  • 試験では「静的でも呼ばれる」と思い込むミスがよく出るので要注意!

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

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