Start · Sprachen · PHP · Referenz · Reflector

Reflector

Interface

Basis-Interface für alle Reflection-Klassen in PHP, das eine einheitliche <code>__toString()</code>-Methode sowie die statische <code>export()</code>-Methode definiert.

seit PHP 5.1.0 Kategorie: oop

Signatur

interface Reflector

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);
Class [ <internal:date> class DateTime implements Stringable, DateTimeInterface ] { ... } Method [ <internal:date> public method format ] { ... }

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);
MyReflector[Beispiel]

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;
    }
}
ReflectionClass implementiert Reflector. ReflectionFunction implementiert Reflector. ReflectionMethod implementiert Reflector.

// 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.