第10章 オブジェクト指向構文 / 第3回 模擬試験
PHPのマジックメソッドに関する次の記述のうち、正しいものはどれか。
`__toString()`は、オブジェクトを文字列として扱おうとした際に自動的に呼び出される。
正解
`__construct()`はマジックメソッドではない。
`__get()`は、定義済みのプロパティにアクセスした際に必ず呼び出される。
マジックメソッドは、メソッド名の前後にアンダースコアを付けなくても機能する。
解説
`__toString()`マジックメソッドは、オブジェクトを`echo $obj;`や`(string) $obj`、文字列連結`.`などで「文字列として扱おうとした」タイミングで自動的に呼び出され、その戻り値が文字列として使われます。
他の選択肢が誤りである理由は次の通りです。
・`__construct()`も、名前が`__`(アンダースコア2つ)で始まりPHPによって自動的に呼び出される特別なメソッドである点で、他のマジックメソッドと同じ「マジックメソッド」の一種です。
・`__get()`が自動的に呼び出されるのは、アクセスしようとしたプロパティが「未定義」または現在のスコープから「アクセスできない(`private`/`protected`)」場合です。通常にアクセス可能なプロパティへのアクセス時には呼び出されません。
・マジックメソッドは、`__toString()`, `__get()`, `__set()`, `__construct()`のように、名前が必ず`__`(アンダースコア2つ)で始まる決まった名前でなければ機能しません。
例:
```
class Money {
public function __construct(private int $amount) {}
public function __toString(): string {
return number_format($this->amount) . '円';
}
}
echo new Money(1000); // 1,000円(__toString()が自動的に呼ばれる)
```
(参照: 独習PHP 第4版 第10章 オブジェクト指向構文 10.8節 マジックメソッド p.555〜568)