Repository navigation
Expand file tree
/
Copy pathtype.texy
More file actions
244 lines (160 loc) · 7.52 KB
/
Copy pathtype.texy
File metadata and controls
244 lines (160 loc) · 7.52 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
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'
```
