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