Code Fix

中級

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する必要があります。

直し方: ShapeCircle にします。

この問題を解いてみる →

広告
広告スロット(未設定)

パターン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します。

直し方: AnimalDog にします。

この問題を解いてみる →

パターン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を使う必要があります。

直し方: VehicleCar にします。

この問題を解いてみる →

よくある誤解

「abstractは単なる注釈で、newしても動くはず」という思い込みは誤りです。abstractクラスの直接インスタンス化は言語レベルで禁止されており、必ず致命的エラーになります。

まとめ

Cannot instantiate abstract classは中級でつまずきやすい項目です。上の3パターンを実際に手で直すと、エラーメッセージのどこを読めばよいかが掴めます。

演習をはじめる

関連するエラー

広告
広告スロット(未設定)