Signatur
Beschreibung
Reflector ist das gemeinsame Basis-Interface aller exportierbaren Reflection-Klassen in PHP (z. B. ReflectionClass, ReflectionMethod, ReflectionFunction usw.). Es stellt sicher, dass jede Reflection-Implementierung über eine __toString()-Methode verfügt, die eine menschenlesbare Darstellung des reflektierten Elements liefert.
Das Interface spielt vor allem eine strukturelle Rolle: Es ermöglicht, mit allen Reflection-Objekten polymorph umzugehen – beispielsweise wenn man eine Funktion erwartet, die irgendeinen Reflektor entgegennimmt, ohne auf einen konkreten Typ festgelegt zu sein.
Eigene Klassen können Reflector implementieren, um sich nahtlos in das Reflection-Ökosystem von PHP einzufügen. Ab PHP 8.0 wurde die statische Methode export(), die zuvor in vielen Reflection-Klassen vorhanden war, entfernt. Das Interface selbst besteht weiterhin und schreibt seit PHP 8.0 nur noch __toString() vor.
Typischerweise wird Reflector als Typ-Hint verwendet, wenn eine Funktion oder Methode mit beliebigen Reflection-Objekten arbeiten soll, ohne an eine bestimmte Klasse gebunden zu sein.
Beispiele
Reflector als Typ-Hint für universelle Ausgabe-Funktion
<?php
function beschreibeReflektor(Reflector $r): void {
echo (string) $r . PHP_EOL;
}
$klasse = new ReflectionClass(DateTime::class);
$methode = new ReflectionMethod(DateTime::class, 'format');
beschreibeReflektor($klasse);
beschreibeReflektor($methode);
Eigene Klasse, die Reflector implementiert
<?php
class MyReflector implements Reflector {
private string $name;
public function __construct(string $name) {
$this->name = $name;
}
public function __toString(): string {
return 'MyReflector[' . $this->name . ']';
}
}
function printReflector(Reflector $r): void {
echo $r . PHP_EOL;
}
$r = new MyReflector('Beispiel');
printReflector($r);
Instanceof-Prüfung über das Interface
<?php
$objekte = [
new ReflectionClass(stdClass::class),
new ReflectionFunction('strlen'),
new ReflectionMethod(ArrayObject::class, 'append'),
];
foreach ($objekte as $obj) {
if ($obj instanceof Reflector) {
echo get_class($obj) . ' implementiert Reflector.' . PHP_EOL;
}
}
// Wichtig · Fallstricke
Entfernung von export() in PHP 8.0: Vor PHP 8.0 schrieb das Reflector-Interface auch eine statische export()-Methode vor, die in jeder konkreten Reflection-Klasse implementiert werden musste. Diese Methode wurde in PHP 8.0 als deprecated markiert und vollständig entfernt. Eigene Reflector-Implementierungen müssen sie daher nicht mehr bereitstellen.
Da Reflector ein sehr allgemeines Interface ist, sollte man für Typ-Hints nach Möglichkeit die spezifischere Klasse (z. B. ReflectionClass) bevorzugen, wenn der genaue Typ bekannt ist.