Signatur
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";
}
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";
}
// 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.