Nette Documentation Preview

syntax
PHP-Typ
*******

.[perex]
[api: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|#allows()] (Kompatibilität), [Typen zu erweitern|#with()] oder Reflection in eine lesbare Schreibweise umzuwandeln.

Installation:

```shell
composer require nette/utils
```

Alle Beispiele setzen voraus, dass dieser Klassen-Alias definiert ist:

```php
use Nette\Utils\Type;
```


fromReflection($reflection): ?Type .[method]
--------------------------------------------

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.

```php
class DemoClass
{
	public self $foo;
}

$prop = new ReflectionProperty(DemoClass::class, 'foo');
echo Type::fromReflection($prop); // 'DemoClass'
```


fromString(string $type): Type .[method]
----------------------------------------

Diese statische Methode erzeugt ein `Type`-Objekt aus seiner String-Darstellung.

```php
$type = Type::fromString('Foo|Bar');
echo $type;      // 'Foo|Bar'
```


fromValue(mixed $value): Type .[method]{data-version:4.0.10}
------------------------------------------------------------

Statische Methode, die ein Type-Objekt anhand des Typs des übergebenen Werts erzeugt.

```php
$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.

```php
$obj = new class extends Foo { };
$type = Type::fromValue($obj);    // 'Foo'
```


getNames(): (string|array)[] .[method]
--------------------------------------

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.

```php
$type = Type::fromString('string|null'); // oder '?string'
$type->getNames();  // ['string', 'null']

$type = Type::fromString('(Foo&Bar)|string');
$type->getNames();  // [['Foo', 'Bar'], 'string']
```


getTypes(): Type[] .[method]
----------------------------

Gibt ein Array von `Type`-Objekten zurück, die die Untertypen eines zusammengesetzten Typs darstellen:

```php
$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 .[method]
----------------------------------

Gibt bei einfachen Typen (auch bei einfachen Nullable-Typen wie `?string`) den Namen des Typs zurück. Andernfalls gibt sie null zurück.

```php
$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 .[method]
--------------------------

Gibt zurück, ob es ein einfacher Typ ist. Zu den einfachen Typen zählen auch einfache Nullable-Typen (etwa `?string`, `?Foo`):

```php
$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 .[method]
-------------------------

Gibt zurück, ob es ein Union-Typ ist (also `|` enthält).

```php
$type = Type::fromString('Foo&Bar');
$type->isUnion();        // true
```


isIntersection(): bool .[method]
--------------------------------

Gibt zurück, ob es ein Intersection-Typ ist (also `&` enthält).


```php
$type = Type::fromString('Foo&Bar');
$type->isIntersection(); // true
```


isBuiltin(): bool .[method]
---------------------------

Gibt zurück, ob der Typ einfach und zugleich ein in PHP eingebauter Typ ist (etwa `string`, `int`, `array`, `callable` und so weiter).

```php
$type = Type::fromString('string');
$type->isBuiltin(); // true

$type = Type::fromString('string|int');
$type->isBuiltin(); // false

$type = Type::fromString('Foo');
$type->isBuiltin(); // false
```


isClass(): bool .[method]
-------------------------

Gibt zurück, ob der Typ einfach und zugleich ein Klassenname ist (also kein eingebauter Typ wie `string` oder `int`).

```php
$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 .[method]
--------------------------------

Gibt zurück, ob der Typ eines der internen Schlüsselwörter `self`, `parent` oder `static` ist.

```php
$type = Type::fromString('self');
$type->isClassKeyword();   // true

$type = Type::fromString('Foo');
$type->isClassKeyword();   // false
```


allows(string|Type $type): bool .[method]
-----------------------------------------

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.

```php
$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 .[method]{data-version:4.0.10}
------------------------------------------------------------

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.

```php
$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'
```

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'