第10章 オブジェクト指向構文 / 第5回 模擬試験

PHPのマジックメソッド`__get()`と`__set()`に関する次の記述のうち、正しいものはどれか。

`__get()`は未定義(またはprivate等でアクセス不可)のプロパティを読み取ろうとした際に呼び出される。 正解
`__set()`はオブジェクトが破棄される際に呼び出される。
`__get()`と`__set()`は、publicプロパティへの通常のアクセス時にも常に呼び出される。
`__get()`はコンストラクタの別名である。
解説
`__get($name)`は、存在しない(未定義)、または`private`/`protected`などで現在のスコープからアクセスできないプロパティを読み取ろうとした際に、PHPが自動的に呼び出すマジックメソッドです。 他の選択肢が誤りである理由は次の通りです。 ・オブジェクトが破棄される際に呼び出されるのは`__destruct()`です。`__set()`はプロパティへの「書き込み」時に呼ばれるメソッドで、破棄のタイミングとは無関係です。 ・`__get()`/`__set()`が呼び出されるのは、あくまで「未定義」または「アクセスできない」プロパティに対してアクセスした場合に限られます。通常にアクセスできる`public`プロパティへの読み書きでは、これらのマジックメソッドは呼び出されません。 ・コンストラクタの役割を持つマジックメソッドは`__construct()`です。`__get()`とは別の仕組みです。 例: ``` class Config { private array $data = ['env' => 'production']; public function __get($name) { return $this->data[$name] ?? null; } } $config = new Config(); echo $config->env; // production(__get()経由で取得される) ``` (参照: 独習PHP 第4版 第10章 オブジェクト指向構文 10.8.1節 未定義のプロパティを処理する① p.555〜557)

あわせて読みたい解説記事