第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)