PHP-Typ
Nette\Utils\Type repräsentiert einen PHP-Datentyp. Die Klasse dient dazu, Typen zu analysieren, zu vergleichen und zu bearbeiten, ganz gleich, ob sie aus einem String oder aus Reflection stammen.
PHP hat inzwischen ein sehr reiches Typsystem: von skalaren Typen (int, string) über Objekte und
Interfaces bis zu zusammengesetzten Typen (Union A|B, Intersection A&B oder disjunktive Normalformen
(A&B)|D). Dazu kommen besondere Typen wie void, never, mixed oder die
relativen Typen self und static.
Mit diesen Typen nativ zu arbeiten, besonders über ReflectionType, ist oft mühsam, weil Sie rekursiv zwischen
ReflectionNamedType, ReflectionUnionType und weiteren Objekten unterscheiden müssen. Die Klasse
Nette\Utils\Type kapselt das alles und bietet eine einheitliche und intuitive API für die Arbeit mit jedem
Typ, den PHP unterstützt.
Sie erlaubt es zum Beispiel, leicht zu prüfen, ob ein Typ einen anderen akzeptiert (Kompatibilität), Typen zu erweitern oder Reflection in eine lesbare Schreibweise umzuwandeln.
Installation:
composer require nette/utils
Alle Beispiele setzen voraus, dass dieser Klassen-Alias definiert ist:
use Nette\Utils\Type;
fromReflection($reflection): ?Type
Diese statische Methode erzeugt ein Type-Objekt anhand von Reflection. Der Parameter kann ein Objekt
ReflectionMethod oder ReflectionFunction sein (dann wird der Typ des Rückgabewerts geliefert) oder ein
Objekt ReflectionParameter bzw. ReflectionProperty. Sie löst self, static und
parent in den tatsächlichen Klassennamen auf. Hat das Subjekt keinen Typ, gibt sie null zurück.
class DemoClass
{
public self $foo;
}
$prop = new ReflectionProperty(DemoClass::class, 'foo');
echo Type::fromReflection($prop); // 'DemoClass'
fromString(string $type): Type
Diese statische Methode erzeugt ein Type-Objekt aus seiner String-Darstellung.
$type = Type::fromString('Foo|Bar');
echo $type; // 'Foo|Bar'
fromValue(mixed $value): Type
Statische Methode, die ein Type-Objekt anhand des Typs des übergebenen Werts erzeugt.
$type = Type::fromValue('hello'); // 'string'
$type = Type::fromValue(123); // 'int'
$type = Type::fromValue(new stdClass); // 'stdClass'
Für Ressourcen gibt sie mixed zurück, weil PHP den Typ resource nicht unterstützt. Für anonyme
Klassen gibt sie den Namen des nächsten Vorfahren oder object zurück.
$obj = new class extends Foo { };
$type = Type::fromValue($obj); // 'Foo'
getNames(): (string|array)[]
Gibt ein Array von Strings zurück, die die Untertypen eines zusammengesetzten Typs darstellen. Bei Intersection-Typen gibt sie ein Array von Arrays zurück.
$type = Type::fromString('string|null'); // oder '?string'
$type->getNames(); // ['string', 'null']
$type = Type::fromString('(Foo&Bar)|string');
$type->getNames(); // [['Foo', 'Bar'], 'string']
getTypes(): Type[]
Gibt ein Array von Type-Objekten zurück, die die Untertypen eines zusammengesetzten Typs darstellen:
$type = Type::fromString('string|null'); // oder '?string'
$type->getTypes(); // [Type::fromString('string'), Type::fromString('null')]
$type = Type::fromString('(Foo&Bar)|string');
$type->getTypes(); // [Type::fromString('Foo&Bar'), Type::fromString('string')]
$type = Type::fromString('Foo&Bar');
$type->getTypes(); // [Type::fromString('Foo'), Type::fromString('Bar')]
getSingleName(): ?string
Gibt bei einfachen Typen (auch bei einfachen Nullable-Typen wie ?string) den Namen des Typs zurück. Andernfalls
gibt sie null zurück.
$type = Type::fromString('string|null');
echo $type; // '?string'
echo $type->getSingleName(); // 'string'
$type = Type::fromString('?Foo');
echo $type; // '?Foo'
echo $type->getSingleName(); // 'Foo'
$type = Type::fromString('Foo|Bar');
echo $type; // 'Foo|Bar'
echo $type->getSingleName(); // null (es ist ein Union-Typ)
isSimple(): bool
Gibt zurück, ob es ein einfacher Typ ist. Zu den einfachen Typen zählen auch einfache Nullable-Typen (etwa
?string, ?Foo):
$type = Type::fromString('string');
$type->isSimple(); // true
$type->isUnion(); // false
$type = Type::fromString('?Foo'); // oder 'Foo|null'
$type->isSimple(); // true
$type->isUnion(); // true (weil er null enthält)
isUnion(): bool
Gibt zurück, ob es ein Union-Typ ist (also | enthält).
$type = Type::fromString('Foo&Bar');
$type->isUnion(); // true
isIntersection(): bool
Gibt zurück, ob es ein Intersection-Typ ist (also & enthält).
$type = Type::fromString('Foo&Bar');
$type->isIntersection(); // true
isBuiltin(): bool
Gibt zurück, ob der Typ einfach und zugleich ein in PHP eingebauter Typ ist (etwa string, int,
array, callable und so weiter).
$type = Type::fromString('string');
$type->isBuiltin(); // true
$type = Type::fromString('string|int');
$type->isBuiltin(); // false
$type = Type::fromString('Foo');
$type->isBuiltin(); // false
isClass(): bool
Gibt zurück, ob der Typ einfach und zugleich ein Klassenname ist (also kein eingebauter Typ wie string oder
int).
$type = Type::fromString('string');
$type->isClass(); // false
$type = Type::fromString('Foo|null');
$type->isClass(); // true
$type = Type::fromString('Foo|Bar');
$type->isClass(); // false
isClassKeyword(): bool
Gibt zurück, ob der Typ eines der internen Schlüsselwörter self, parent oder
static ist.
$type = Type::fromString('self');
$type->isClassKeyword(); // true
$type = Type::fromString('Foo');
$type->isClassKeyword(); // false
allows(string|Type $type): bool
Die Methode allows() prüft die Kompatibilität von Typen. Sie kann zum Beispiel feststellen, ob sich ein Wert
eines bestimmten Typs als Parameter an eine Funktion übergeben ließe, die diesen Typ erwartet.
$type = Type::fromString('string|null');
$type->allows('string'); // true
$type->allows('null'); // true
$type->allows('Foo'); // false
$type = Type::fromString('mixed');
$type->allows('null'); // true
with(string|Type $type): Type
Gibt ein Type-Objekt zurück, das sowohl den ursprünglichen als auch den hinzugefügten Typ akzeptiert. Es entsteht ein sogenannter Union-Typ.
Die Methode ist clever und dupliziert Typen nicht unnötig. Fügen Sie einen Typ hinzu, der bereits enthalten ist oder eine
Obermenge des aktuellen Typs bildet (etwa mixed zu string), wird das Ergebnis vereinfacht.
$type = Type::fromString('string');
// Erweiterung zu einem nullable string
echo $type->with('null'); // '?string'
// Erzeugung eines Union-Typs
echo $type->with('int'); // 'string|int'
// Hinzufügen eines Typs, der alles übertrumpft
echo $type->with('mixed'); // 'mixed'