Signatur
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();
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!';
}
}
Ü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');
// 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.