第10章 オブジェクト指向構文 / 第2回 模擬試験
PHPのカプセル化とゲッター・セッターに関する次の記述のうち、正しいものはどれか。
ゲッター・セッターは、`private`プロパティへの安全なアクセス手段として使われる。
正解
PHPには魔法のメソッド`__get()`, `__set()`は存在しない。
ゲッター・セッターを使うと、必ずプロパティのバリデーションができなくなる。
すべてのプロパティは`public`にすることがベストプラクティスとされる。
解説
ゲッター(`getName()`など)・セッター(`setName()`など)メソッドは、`private`や`protected`にしたプロパティへ外部から間接的にアクセスするための、安全なインターフェースとして使われます。セッター内でバリデーションを行うことで、不正な値の代入を防ぐこともできます。
他の選択肢が誤りである理由は次の通りです。
・PHPには`__get()`、`__set()`という「マジックメソッド」が存在し、未定義または`private`なプロパティへのアクセス時に自動的に呼び出されるフックとして使えます。
・ゲッター・セッターを使うことで、代入前の値をチェックする(バリデーションする)処理を挟むことが「できるようになります」。「必ずできなくなる」は逆の説明です。
・すべてのプロパティを`public`にすると外部から自由に値を書き換えられてしまい、カプセル化の利点が失われます。ベストプラクティスとしては、必要な場合のみ`public`にし、それ以外は`private`/`protected`とゲッター・セッターで制御します。
例:
```
class User {
private string $email = '';
public function setEmail(string $email): void {
if (!str_contains($email, '@')) {
throw new InvalidArgumentException('不正なメールアドレスです');
}
$this->email = $email;
}
public function getEmail(): string {
return $this->email;
}
}
```
(参照: 独習PHP 第4版 第10章 オブジェクト指向構文 10.2.2節 アクセサーメソッド p.491〜495)