Start · Sprachen · PHP · Referenz · ReflectionIntersectionType

ReflectionIntersectionType

Klasse

Repräsentiert einen Intersection-Typ (z. B. <code>Iterator&Countable</code>) und liefert zur Laufzeit Informationen über seine Bestandteile.

seit PHP 8.1.0 Kategorie: oop

Signatur

class ReflectionIntersectionType extends ReflectionType

Beschreibung

ReflectionIntersectionType ist Teil der PHP-Reflection-API und ermöglicht es, Intersection-Typen (seit PHP 8.1) programmatisch zu analysieren. Ein Intersection-Typ verlangt, dass ein Wert alle beteiligten Typen gleichzeitig erfüllt, z. B. Iterator&Countable. Die Klasse wird nicht direkt instanziiert, sondern über Reflection-Methoden wie ReflectionParameter::getType() oder ReflectionNamedType::getType() zurückgegeben.

Über die geerbte Methode getTypes() erhält man ein Array von ReflectionNamedType-Objekten, die die einzelnen Typen des Intersection repräsentieren. So lässt sich z. B. prüfen, welche Interfaces ein Parameter erfordert, ohne den Quellcode manuell parsen zu müssen.

Typischerweise wird ReflectionIntersectionType in Frameworks, Dependency-Injection-Containern oder Code-Analyse-Tools verwendet, um typsichere Abhängigkeiten automatisch aufzulösen oder Typ-Dokumentation zu generieren.

Da Intersection-Typen nur aus benannten Typen (Klassen/Interfaces) bestehen dürfen – keine skalaren Typen, kein null –, liefert allowsNull() immer false und alle Elemente von getTypes() sind stets ReflectionNamedType-Instanzen.

Beispiele

Intersection-Typ eines Parameters analysieren

<?php
interface Stringable {}
interface Countable {}

function process(Stringable&Countable $value): void {}

$ref   = new ReflectionFunction('process');
$param = $ref->getParameters()[0];
$type  = $param->getType();

if ($type instanceof ReflectionIntersectionType) {
    echo "Intersection-Typ gefunden:\n";
    foreach ($type->getTypes() as $t) {
        echo '  - ' . $t->getName() . "\n";
    }
    echo 'Erlaubt null: ' . ($type->allowsNull() ? 'ja' : 'nein') . "\n";
}
Intersection-Typ gefunden: - Stringable - Countable Erlaubt null: nein

Rückgabetyp einer Methode auf Intersection prüfen

<?php
interface Iterator {}
interface Countable {}

class Collection {
    public function getIterator(): Iterator&Countable
    {
        // ...
    }
}

$method = new ReflectionMethod(Collection::class, 'getIterator');
$returnType = $method->getReturnType();

if ($returnType instanceof ReflectionIntersectionType) {
    $names = array_map(
        fn(ReflectionNamedType $t) => $t->getName(),
        $returnType->getTypes()
    );
    echo 'Rückgabe muss folgende Typen erfüllen: ' . implode(' & ', $names) . "\n";
} else {
    echo 'Kein Intersection-Typ.' . "\n";
}
Rückgabe muss folgende Typen erfüllen: Iterator & Countable

// Wichtig · Fallstricke

Nur PHP 8.1+: Intersection-Typen existieren erst ab PHP 8.1. In älteren Versionen führt der Einsatz dieser Syntax zu einem Parse-Fehler.

Keine Union-Kombination: In PHP 8.1 dürfen Intersection-Typen nicht mit Union-Typen (z. B. A&B|null) kombiniert werden. Ab PHP 8.2 sind sogenannte DNF-Typen (Disjunctive Normal Form) erlaubt – dort kann ein Intersection-Typ Teil eines Union-Typs sein. In diesem Fall liefert ReflectionUnionType::getTypes() ReflectionIntersectionType-Objekte als Elemente.

Instanziierung: ReflectionIntersectionType kann nicht manuell mit new erstellt werden; Instanzen werden ausschließlich von der Reflection-API zurückgegeben.