Cannot instantiate abstract class の原因と直し方
abstractを付けたクラスは、そのままnewしてインスタンス化することができません。abstractクラスはサブクラスに実装させるための設計図であり、必ず継承先のクラスを使う必要があります。
エラーメッセージの読み方
Fatal error: Uncaught Error: Cannot instantiate abstract class Shape in main.php:8
main.php- ファイル名
8- 行番号 — 実際にクラッシュした行
Error- 例外クラス — 何が起きたか。ここを検索するのが最短です
Cannot instantiate abstract class Shape- 内容 — どの値が問題だったか
このエラーが出る典型パターン
パターン1
1 <?php 2 abstract class Shape { 3 abstract public function area(): float; 4 } 5 class Circle extends Shape { 6 public function area(): float { return 3.14; } 7 } 8 $s = new Shape (); ^
Fatal error: Uncaught Error: Cannot instantiate abstract class Shape in main.php:8
abstractクラスは直接newできません。areaを実装した具象クラスCircleをnewする必要があります。
直し方: Shape を Circle にします。
広告
広告スロット(未設定)
パターン2
1 <?php 2 abstract class Animal { 3 abstract public function speak(): string; 4 } 5 class Dog extends Animal { 6 public function speak(): string { return "Woof"; } 7 } 8 $a = new Animal (); ^ 9 echo $a->speak();
Fatal error: Uncaught Error: Cannot instantiate abstract class Animal in main.php:8
Animalはabstractなのでnewできません。speakを実装したDogをnewします。
直し方: Animal を Dog にします。
パターン3
1 <?php 2 abstract class Vehicle { 3 abstract public function wheels(): int; 4 } 5 class Car extends Vehicle { 6 public function wheels(): int { return 4; } 7 } 8 $v = new Vehicle (); ^ 9 echo $v->wheels();
Fatal error: Uncaught Error: Cannot instantiate abstract class Vehicle in main.php:8
Vehicleはabstractなのでインスタンスにできません。wheelsを実装したCarを使う必要があります。
直し方: Vehicle を Car にします。
よくある誤解
「abstractは単なる注釈で、newしても動くはず」という思い込みは誤りです。abstractクラスの直接インスタンス化は言語レベルで禁止されており、必ず致命的エラーになります。
まとめ
Cannot instantiate abstract classは中級でつまずきやすい項目です。上の3パターンを実際に手で直すと、エラーメッセージのどこを読めばよいかが掴めます。