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

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