Start · Sprachen · PHP · Referenz · Override

Override

Klasse

PHP-Attribut, das kennzeichnet, dass eine Methode eine Methode aus einer Elternklasse oder einem Interface überschreibt.

seit PHP 8.3.0 Kategorie: misc

Signatur

#[Override]

Beschreibung

Das #[Override]-Attribut wurde in PHP 8.3 eingeführt und dient als deklarative Sicherheitsprüfung beim Überschreiben von Methoden. Es teilt der PHP-Engine mit, dass die markierte Methode eine gleichnamige Methode in einer Elternklasse oder einem implementierten Interface überschreiben muss. Existiert in der Elternklasse oder im Interface keine solche Methode, wirft PHP einen fatalen Fehler.

Dieses Attribut dient in erster Linie der Wartbarkeit und Refactoring-Sicherheit: Wenn eine Elternmethode umbenannt oder entfernt wird, erkennt man sofort, dass die Kindklasse eine nun verwaiste Überschreibung besitzt. Ohne #[Override] würde eine nicht mehr überschreibende Methode stillschweigend als eigenständige neue Methode der Kindklasse behandelt – ein häufiger und schwer zu findender Fehler.

Das Attribut hat keinen Einfluss auf das Laufzeitverhalten, es ist rein deklarativ und wird zur Kompilierzeit geprüft. Es kann nur auf Instanz- und statische Methoden, nicht aber auf Eigenschaften oder Klassenkonstanten angewendet werden.

  • Geeignet für alle Klassen, die Methoden aus Elternklassen oder Interfaces überschreiben.
  • Besonders wertvoll in größeren Codebases und bei intensivem Refactoring.
  • Kombinierbar mit abstrakten Klassen und Interfaces.

Beispiele

Grundlegendes Überschreiben einer Elternmethode

<?php
class ParentClass
{
    public function greet(): string
    {
        return 'Hallo aus der Elternklasse!';
    }
}

class ChildClass extends ParentClass
{
    #[Override]
    public function greet(): string
    {
        return 'Hallo aus der Kindklasse!';
    }
}

$obj = new ChildClass();
echo $obj->greet();
Hallo aus der Kindklasse!

Fataler Fehler bei nicht vorhandener Elternmethode

<?php
class Base
{
    public function existingMethod(): void
    {
        echo 'Ich existiere.';
    }
}

class Child extends Base
{
    #[Override]
    public function nonExistentMethod(): void
    {
        // PHP wirft hier einen fatalen Fehler:
        // Child::nonExistentMethod() has #[\Override] attribute,
        // but no matching parent method exists
        echo 'Diese Methode existiert nicht in der Elternklasse!';
    }
}
Fatal error: Child::nonExistentMethod() has #[\Override] attribute, but no matching parent method exists

Überschreiben einer Interface-Methode

<?php
interface Logger
{
    public function log(string $message): void;
}

class FileLogger implements Logger
{
    #[Override]
    public function log(string $message): void
    {
        echo '[FILE] ' . $message . PHP_EOL;
    }
}

$logger = new FileLogger();
$logger->log('Testmeldung');
[FILE] Testmeldung

// Wichtig · Fallstricke

Wichtig: #[Override] prüft nur, ob eine gleichnamige Methode in der Elternklasse oder einem direkt implementierten Interface vorhanden ist. Sichtbarkeitsregeln (z. B. private in der Elternklasse) werden dabei ebenfalls berücksichtigt – eine private Elternmethode kann nicht überschrieben werden und führt trotz gleichem Namen zu einem Fehler. Das Attribut ist rein statisch und hat keinen Einfluss auf die Programmlogik zur Laufzeit. Es kann nicht auf Konstruktoren (__construct) angewendet werden, wenn die Elternklasse keinen expliziten Konstruktor definiert.