第10章 オブジェクト指向構文 / 第3回 模擬試験

次のコードの実行結果として正しいものはどれか。 ```php abstract class Shape { abstract public function area(): float; } class Circle extends Shape { public function __construct(private float $radius) {} public function area(): float { return 3.14 * $this->radius ** 2; } } $c = new Circle(2); print $c->area(); ```

12.56 正解
6.28
4
エラーが発生する
解説
コンストラクタプロモーション(`public function __construct(private float $radius) {}`)により、コンストラクタの引数がそのまま`private`プロパティとして自動的に定義・初期化されます。`area()`メソッドは`3.14 * $this->radius ** 2`を計算します。 `$radius`は`2`なので、`2 ** 2 = 4`、`3.14 * 4 = 12.56`となります。 例: ``` abstract class Shape { abstract public function area(): float; } class Circle extends Shape { public function __construct(private float $radius) {} public function area(): float { return 3.14 * $this->radius ** 2; } } $c = new Circle(2); print $c->area(); // 12.56 ``` `abstract`クラス`Shape`は直接インスタンス化できませんが、`area()`を実装した`Circle`のような具象クラスはインスタンス化できます。演算子の優先順位として`**`(べき乗)が`*`(乗算)より先に評価される点もポイントです。 (参照: 独習PHP 第4版 第10章 オブジェクト指向構文 10.4.1節 抽象メソッド p.514〜515)

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