Generics in PHP: Wozu sie dienen und wie man sie verwendet

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Generics in PHP: warum sie wichtig sind und wie man sie verwendet



Generics (generische Typen) gehören zu den am meisten erwarteten und diskutierten Funktionen in der PHP-Welt. Obwohl sie zum Zeitpunkt von PHP 8.x offiziell noch nicht vollständig in der Sprache implementiert sind, nutzt die Community aktiv alternative Ansätze und wartet auf volle Unterstützung. In diesem Artikel werden wir uns ansehen, warum Generics in PHP benötigt werden, wie man sie emulieren kann und welche Vorteile sie dem Entwickler bieten.



Was sind Generics und warum werden sie benötigt?



Generics ermöglichen es, Klassen, Interfaces und Funktionen zu erstellen, die mit verschiedenen Datentypen arbeiten, dabei aber eine strenge Typisierung beibehalten. In Sprachen mit statischer Typisierung (Java, C#, TypeScript) sind sie bereits seit langem Standard. Für PHP, das ursprünglich dynamisch typisiert war, sind Generics ein Schritt hin zu zuverlässigerem und lesbarerem Code.



Hauptprobleme, die Generics lösen:

  • Typsicherheit — sie schließen Fehler aus, die durch die Übergabe von Daten des falschen Typs entstehen.
  • Reduzierung von Code-Duplizierung — es müssen keine separaten Klassen für jeden Typ geschrieben werden.
  • Verbesserung der Lesbarkeit — es ist sofort klar, mit welchen Typen eine Funktion oder Klasse arbeitet.
  • IDE-Unterstützung — Autovervollständigung und Code-Analyse werden genauer.


Das Problem ohne Generics: Ein Beispiel in PHP



Stellen Sie sich vor, Sie müssen eine Collection erstellen, die nur ganze Zahlen speichert. Ohne Generics könnten Sie schreiben:



class IntegerCollection {    private array $items = [];

public function add(int $item): void { $this->items[] = $item; }

public function get(int $index): int { return $this->items[$index]; }}


Das funktioniert, aber wenn eine Collection für Strings benötigt wird, müsste der Code kopiert und die Typen geändert werden. Und wenn eine Collection für Objekte benötigt wird — das Gleiche. Dies führt zu Duplizierung und einer Vergrößerung des Codeumfangs.



Emulation von Generics in PHP mit Annotationen und PHPDoc



Derzeit unterstützt PHP keine vollwertigen Generics auf Syntaxebene, aber sie können mit PHPDoc-Annotationen und speziellen Bibliotheken (z.B. phpstan/phpstan oder vimeo/psalm) emuliert werden.



Beispiel einer generischen Klasse mit Annotationen:



/** * @template T */class Collection {    private array $items = [];

/** * @param T $item */ public function add($item): void { $this->items[] = $item; }

/** * @return T */ public function get(int $index) { return $this->items[$index]; }}


Jetzt können Sie bei der Verwendung der Klasse einen bestimmten Typ angeben:



/** @var Collection<int> $intCollection */$intCollection = new Collection();$intCollection->add(42);$value = $intCollection->get(0); // IDE weiß, dass dies ein int ist


Statische Analysatoren (PHPStan, Psalm) überprüfen, dass Sie keinen String an eine Collection von ganzen Zahlen übergeben. Dies bietet fast die gleiche Sicherheit wie vollwertige Generics.



Reale Anwendungsbeispiele für Generics in PHP



Betrachten wir einige praktische Szenarien, in denen Generics besonders nützlich sind.



1. Repositories in Doctrine



In Doctrine ORM arbeiten Sie oft mit Repositories. Generics helfen dabei, explizit anzugeben, mit welcher Entität das Repository arbeitet:



/** * @template T of object */interface RepositoryInterface {    /**     * @param int $id     * @return T|null     */    public function find(int $id): ?object;}

/** * @implements RepositoryInterface<User> */class UserRepository implements RepositoryInterface { public function find(int $id): ?User { // Suchlogik }}


2. Das Strategie-Muster mit Generics



Generics ermöglichen das Erstellen

Blogs

Buchempfehlungen