第10章 オブジェクト指向構文 / 第5回 模擬試験
PHPのマジックメソッド`__call()`と`__callStatic()`に関する次の記述のうち、正しいものはどれか。
`__call()`は未定義のインスタンスメソッドが呼び出された際に、`__callStatic()`は未定義の静的メソッドが呼び出された際に実行される。
正解
`__call()`と`__callStatic()`は全く同じタイミングで呼び出される。
`__call()`はコンストラクタの代わりに使用するマジックメソッドである。
`__call()`は定義済みのメソッドを呼び出した際に必ず実行される。
解説
`__call($name, $args)`は、そのオブジェクトに存在しない(未定義の)「インスタンスメソッド」が呼び出されたときに自動的に実行されます。一方`__callStatic($name, $args)`は、存在しない「静的メソッド」が呼び出されたときに実行されます。
他の選択肢が誤りである理由は次の通りです。
・`__call()`はインスタンスメソッド呼び出し時、`__callStatic()`は静的メソッド呼び出し時と、それぞれ発動するタイミングが異なります。「全く同じタイミング」というのは誤りです。
・コンストラクタの役割を持つマジックメソッドは`__construct()`です。`__call()`とは別の仕組みです。
・`__call()`が呼び出されるのは「未定義」のメソッドが呼ばれたときだけです。定義済みのメソッドを呼び出した場合は、通常通りそのメソッドが直接実行され、`__call()`は呼ばれません。
例:
```
class Proxy {
public function __call($name, $args) {
echo "未定義メソッド {$name} が呼ばれました
";
}
public static function __callStatic($name, $args) {
echo "未定義の静的メソッド {$name} が呼ばれました
";
}
}
(new Proxy())->foo(); // 未定義メソッド foo が呼ばれました
Proxy::bar(); // 未定義の静的メソッド bar が呼ばれました
```
(参照: 独習PHP 第4版 第10章 オブジェクト指向構文 10.8.3節 未定義のメソッドを処理する p.559〜561)