W3docs

abstract

Das Schlüsselwort abstract definiert abstrakte Klassen und Methoden in PHP. Eine abstrakte Klasse kann nicht instanziiert werden.

Das Schlüsselwort abstract in PHP

Das Schlüsselwort abstract markiert eine Klasse oder Methode als bewusst unvollständig. Eine abstrakte Klasse definiert eine gemeinsame Struktur und gemeinsames Verhalten, kann jedoch nicht direkt zu einem Objekt gemacht werden — sie ist dazu gedacht, erweitert zu werden. Eine abstrakte Methode deklariert die Signatur einer Methode ohne Rumpf und zwingt jede konkrete Unterklasse dazu, die eigentliche Implementierung bereitzustellen.

Diese Seite erläutert, was abstrakte Klassen und Methoden sind, wie man sie deklariert, welche Regeln PHP durchsetzt und wann abstract die richtige Designentscheidung ist.

Was ist eine abstrakte Klasse?

Eine abstrakte Klasse ist eine Klasse, die nicht direkt instanziiert werden kann. Sie ist dazu gedacht, von anderen Klassen erweitert zu werden, die die fehlenden Teile ergänzen. Eine abstrakte Klasse kann zwei Arten von Membern mischen:

  • Abstrakte Methoden — deklariert, aber nicht implementiert; die Arbeit wird den Unterklassen überlassen.
  • Konkrete Methoden und Eigenschaften — vollständig implementiert und unverändert vererbt, sodass gemeinsame Logik an einem Ort verwaltet wird.

Die Regel gilt in eine Richtung: Eine Klasse mit mindestens einer abstrakten Methode muss als abstract deklariert werden. Das Gegenteil ist nicht erforderlich — eine Klasse kann abstrakt sein, ohne abstrakte Methoden zu besitzen, einfach um zu verhindern, dass sie instanziiert wird.

<?php

abstract class Animal {
    // Concrete method — inherited by every subclass unchanged
    public function describe(): string {
        return "I am a " . static::class . " and I say " . $this->makeSound();
    }

    // Abstract method — each subclass must implement it
    abstract public function makeSound(): string;
}

Was ist eine abstrakte Methode?

Eine abstrakte Methode wird mit dem Schlüsselwort abstract deklariert, hat keinen Rumpf und endet mit einem Semikolon anstelle von { ... }. Ihre Aufgabe besteht darin, einen Vertrag zu definieren: Jede Unterklasse, die konkret sein möchte, muss eine passende Implementierung bereitstellen.

<?php

abstract public function makeSound(): string; // signature only, no body

Eine Unterklasse muss die Methode kompatibel mit der abstrakten Deklaration halten — dieselben (oder kompatiblen) Parameter und eine Sichtbarkeit, die gleich oder weniger restriktiv als das Original ist.

Wie man eine abstrakte Klasse und Methode definiert

Setzen Sie abstract vor class, um die Klasse abstrakt zu machen, und vor function, um eine Methode abstrakt zu machen. Hier ist das vollständige Muster — eine Basisklasse mit einer gemeinsamen Methode und einer abstrakten Methode sowie zwei konkreten Unterklassen:

<?php

abstract class Animal {
    public function describe(): string {
        return static::class . " says " . $this->makeSound();
    }

    abstract public function makeSound(): string;
}

class Dog extends Animal {
    public function makeSound(): string {
        return "Woof!";
    }
}

class Cat extends Animal {
    public function makeSound(): string {
        return "Meow!";
    }
}

echo (new Dog())->describe(), "\n"; // Dog says Woof!
echo (new Cat())->describe(), "\n"; // Cat says Meow!

Jede Unterklasse implementiert makeSound() und erbt describe() kostenlos — diese gemeinsame Methode ist genau der Grund, warum eine abstrakte Basisklasse hier nützlicher ist als ein einfaches Interface.

Was passiert, wenn man eine abstrakte Klasse instanziiert?

Der Versuch, ein Objekt aus einer abstrakten Klasse zu erstellen, führt zu einem fatalen Fehler, der zur Kompilierzeit erkannt wird:

<?php

abstract class Animal {
    abstract public function makeSound(): string;
}

$a = new Animal();
// Fatal error: Cannot instantiate abstract class Animal

Derselbe Fehler tritt auf, wenn eine Unterklasse vergisst, eine geerbte abstrakte Methode zu implementieren — PHP betrachtet diese Unterklasse dann ebenfalls als abstrakt.

Regeln und Fallstricke

  • Eine Klasse mit einer beliebigen abstrakten Methode muss als abstract deklariert werden.
  • Abstrakte Methoden können nicht private sein — Unterklassen könnten sie nicht sehen, um sie zu überschreiben. Verwenden Sie public oder protected.
  • Abstrakte Methoden können nicht final sein (sie sollen überschrieben werden) und dürfen seit PHP 8.0 nicht auf sinnvolle überschreibbare Weise static sein — bevorzugen Sie instanzbasierte abstrakte Methoden.
  • Eine abstrakte Klasse kann einen Konstruktor haben; Unterklassen rufen ihn mit parent::__construct() auf.
  • Eine Unterklasse, die nicht jede geerbte abstrakte Methode implementiert, muss selbst als abstract deklariert werden.

Abstrakte Klasse vs. Interface

Beide definieren einen Vertrag, beantworten aber unterschiedliche Fragen:

  • Eine abstrakte Klasse ("ist-ein") kann konkrete Methoden, Eigenschaften und Konstruktoren enthalten. Eine Klasse kann nur eine abstrakte Klasse erweitern.
  • Ein Interface ("kann-tun") deklariert nur Methodensignaturen (keine Implementierung, kein Instanzstatus), und eine Klasse kann viele Interfaces implementieren.

Greifen Sie auf eine abstrakte Klasse zurück, wenn Unterklassen echte Implementierungen teilen; verwenden Sie ein Interface, wenn Sie lediglich eine Fähigkeit garantieren müssen. Weitere Informationen finden Sie unter PHP Inheritance und PHP Interfaces.

Fazit

Das Schlüsselwort abstract ermöglicht es Ihnen, einen partiellen Bauplan zu definieren: Eine abstrakte Klasse stellt gemeinsames Verhalten bereit, während sie abstrakte Methoden deklariert, die jede konkrete Unterklasse implementieren muss. Eine abstrakte Klasse kann nicht direkt instanziiert werden — das ist der Sinn. Verwenden Sie sie, wenn mehrere verwandte Klassen Logik teilen, aber jede bestimmte Schritte anpassen muss, und wählen Sie stattdessen ein Interface, wenn keine gemeinsame Implementierung vorliegt.

Übungen

Übung
Was sind die Regeln für abstrakte Klassen und Methoden in PHP, wie auf w3docs.com beschrieben?
Was sind die Regeln für abstrakte Klassen und Methoden in PHP, wie auf w3docs.com beschrieben?
Was this page helpful?