-
Notifications
You must be signed in to change notification settings - Fork 50
Expand file tree
/
Copy pathnew-features.xml
More file actions
457 lines (398 loc) · 13.2 KB
/
new-features.xml
File metadata and controls
457 lines (398 loc) · 13.2 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
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: e150cc645a17588282e5e6b5e43e600a2f345549 Maintainer: samesch Status: ready -->
<!-- Reviewed: no -->
<sect1 xml:id="migration74.new-features" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>Neue Features</title>
<sect2 xml:id="migration74.new-features.core">
<title>PHP-Kern</title>
<sect3 xml:id="migration74.new-features.core.typed-properties">
<title>Typisierte Eigenschaften</title>
<para>
Klasseneigenschaften unterstützen nun Typ-Deklarationen.
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
class User {
public int $id;
public string $name;
}
?>
]]>
</programlisting>
</informalexample>
Das obige Beispiel erzwingt, dass <literal>$user->id</literal> nur
<type>int</type>-Werte zugewiesen werden können und
<literal>$user->name</literal> nur <type>string</type>-Werte.
</para>
</sect3>
<sect3 xml:id="migration74.new-features.core.arrow-functions">
<title>Pfeilfunktionen</title>
<para>
Die <link linkend="functions.arrow">Pfeilfunktionen</link> bieten eine
Kurzform der Syntax für die Definition von Funktionen mit impliziter
Bindung an den Wertebereich.
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
$factor = 10;
$nums = array_map(fn($n) => $n * $factor, [1, 2, 3, 4]);
// $nums = array(10, 20, 30, 40);
?>
]]>
</programlisting>
</informalexample>
</para>
</sect3>
<sect3 xml:id="migration74.new-features.core.type-variance">
<title>Eingeschränkte Kovarianz des Rückgabetyps und Kontravarianz des Parametertyps</title>
<para>
Der folgende Code funktioniert nun:
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
class A {}
class B extends A {}
class Producer {
public function method(): A {}
}
class ChildProducer extends Producer {
public function method(): B {}
}
?>
]]>
</programlisting>
</informalexample>
Die vollständige Unterstützung der Varianz ist nur verfügbar, wenn
automatisches Laden verwendet wird. Innerhalb einer einzelnen Datei sind
nur nichtzyklische Typreferenzen möglich, da alle Klassen verfügbar sein
müssen, bevor sie referenziert werden.
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
/**
* Diese Klassen erfüllen die LSP-Anforderungen, da C ein Subtyp von A ist.
* Zum Zeitpunkt der Deklaration der Klasse B ist die Klasse C jedoch noch
* nicht verfügbar. */
class A
{
public function method(): A {}
}
class B extends A
{
// Fatal error: Could not check compatibility between B::method():C and
// A::method(): A, because class С is not available
public function method(): С {}
}
class C extends B {}
?>
]]>
</programlisting>
</informalexample>
</para>
</sect3>
<sect3 xml:id="migration74.new-features.core.null-coalescing-assignment-operator">
<title>Zuweisungsoperator für die Kombination mit null (null-Koaleszenz)</title>
<para>
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
$array['key'] ??= computeDefault();
// entspricht in etwa
if (!isset($array['key'])) {
$array['key'] = computeDefault();
}
?>
]]>
</programlisting>
</informalexample>
</para>
</sect3>
<sect3 xml:id="migration74.new-features.core.unpack-inside-array">
<title>Entpacken innerhalb von Arrays</title>
<para>
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
$parts = ['apple', 'pear'];
$fruits = ['banana', 'orange', ...$parts, 'watermelon'];
// ['banana', 'orange', 'apple', 'pear', 'watermelon'];
?>
]]>
</programlisting>
</informalexample>
</para>
</sect3>
<sect3 xml:id="migration74.new-features.core.numeric-literal-separator">
<title>Trennzeichen für numerische Literale</title>
<para>
Bei numerischen Literalen können nun Unterstriche zwischen den Ziffern
eingefügt werden.
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
6.674_083e-11; // Gleitkommazahl
299_792_458; // Dezimalzahl
0xCAFE_F00D; // Hexadezimalzahl
0b0101_1111; // Binärzahl
?>
]]>
</programlisting>
</informalexample>
</para>
</sect3>
<sect3 xml:id="migration74.new-features.core.weakreference">
<title>Schwache Referenzen</title>
<para>
Eine <link linkend="class.weakreference">schwache Referenz</link>
ermöglicht es dem Programmierer, eine Referenz auf ein Objekt zu behalten,
die nicht verhindert, dass das Objekt zerstört wird.
</para>
</sect3>
<sect3 xml:id="migration74.new-features.core.tostring-exceptions">
<title>Zulassen von Exceptions aus __toString()</title>
<para>
Bei der Methode <link linkend="object.tostring">__toString()</link> ist es
nun möglich, Exceptions auszulösen. Zuvor führte dies zu einem
schwerwiegenden Fehler. Alle behebbaren schwerwiegenden Fehler bei
Zeichenketten-Konvertierungen wurden in
<classname>Error</classname>-Exceptions umgewandelt.
</para>
</sect3>
</sect2>
<sect2 xml:id="migration74.new-features.curl">
<title>CURL</title>
<para>
Wenn die Erweiterung mit libcurl >= 7.56.0 kompiliert wurde, unterstützt
die Klasse <classname>CURLFile</classname> nun zusätzlich zu einfachen
Dateinamen auch Stream-Wrapper.
</para>
</sect2>
<sect2 xml:id="migration74.new-features.filter">
<title>Filter</title>
<para>
Der Filter <constant>FILTER_VALIDATE_FLOAT</constant> unterstützt nun die
Optionen <literal>min_range</literal> und <literal>max_range</literal> mit
der gleichen Semantik wie <constant>FILTER_VALIDATE_INT</constant>.
</para>
</sect2>
<sect2 xml:id="migration74.new-features.ffi">
<title>FFI</title>
<para>
FFI ist eine neue Erweiterung, die eine einfache Möglichkeit bietet, native
Funktionen aufzurufen, auf native Variablen zuzugreifen und Datenstrukturen
zu erzeugen/aufzurufen, die in C-Bibliotheken definiert sind.
</para>
</sect2>
<sect2 xml:id="migration74.new-features.gd">
<title>GD</title>
<para>
Der Bildfilter <constant>IMG_FILTER_SCATTER</constant> wurde hinzugefügt,
um einen Streufilter auf Bilder anzuwenden.
</para>
</sect2>
<sect2 xml:id="migration74.new-features.hash">
<title>Hash</title>
<para>
Der <literal>crc32c</literal>-Hash, der das Castagnoli-Polynom verwendet,
wurde hinzugefügt. Diese CRC32-Variante wird in Speichersystemen wie iSCSI,
SCTP, Btrfs und ext4 verwendet.
</para>
</sect2>
<sect2 xml:id="migration74.new-features.mbstring">
<title>Multibyte-Zeichenketten</title>
<para>
Die Funktion <function>mb_str_split</function> wurde hinzugefügt. Sie
bietet die gleiche Funktionalität wie <function>str_split</function>,
arbeitet aber mit Codepunkten anstelle von Bytes.
</para>
</sect2>
<sect2 xml:id="migration74.new-features.opcache">
<title>OPcache</title>
<para>
Die Unterstützung für das
<link linkend="opcache.preloading">Vorladen von Code</link> wurde
hinzugefügt.
</para>
</sect2>
<sect2 xml:id="migration74.new-features.pcre">
<title>Reguläre Ausdrücke (Perl-kompatibel)</title>
<para>
Die Funktionen <function>preg_replace_callback</function> und
<function>preg_replace_callback_array</function> akzeptieren nun zusätzlich
den Parameter <parameter>flags</parameter>, der die Flags
<constant>PREG_OFFSET_CAPTURE</constant> und
<constant>PREG_UNMATCHED_AS_NULL</constant> unterstützt. Dies beeinflusst
das Format des Arrays für die Übereinstimmungen, das an die
Callback-Funktion übergeben wird.
</para>
</sect2>
<sect2 xml:id="migration74.new-features.pdo">
<title>PDO</title>
<para>
Bei den Treibern für mysql, mssql, dblib, firebird und oci können
Benutzername und Passwort nun als Teil des PDO DSN angegeben werden. Zuvor
wurde dies nur vom pgsql-Treiber unterstützt. Wenn ein Benutzername/Passwort
sowohl im Konstruktor als auch im DSN angegeben wird, hat der Konstruktor
Vorrang.
</para>
<para>
Es ist nun möglich, Fragezeichen in SQL-Abfragen zu maskieren, damit sie
nicht als als Platzhalter für Parameter interpretiert werden. Mit
<literal>??</literal> ist es möglich, ein einzelnes Fragezeichen an die
Datenbank zu senden. Dieses kann &zb; bei PostgreSQL als
<literal>?</literal>-Operator verwendet werden, um zu prüfen, ob ein
JSON-Schlüssel existiert.
</para>
</sect2>
<sect2 xml:id="migration74.new-features.pdo_oci">
<title>PDO_OCI</title>
<para>
Die Methode <methodname>PDOStatement::getColumnMeta</methodname> ist nun
verfügbar.
</para>
</sect2>
<sect2 xml:id="migration74.new-features.pdo_sqlite">
<title>PDO_SQLite</title>
<para>
<literal>PDOStatement::getAttribute(PDO::SQLITE_ATTR_READONLY_STATEMENT)</literal>
ermöglicht es, zu prüfen, ob eine Anweisung nur lesend ist, &dh;, ob sie
die Datenbank nicht verändert.
</para>
<para>
<literal>PDO::setAttribute(PDO::SQLITE_ATTR_EXTENDED_RESULT_CODES, true)</literal>
ermöglicht in <function>PDO::errorInfo</function> und
<function>PDOStatement::errorInfo</function> die Verwendung der erweiterten
SQLite3-Ergebniscodes.
</para>
</sect2>
<sect2 xml:id="migration74.new-features.sqlite3">
<title>SQLite3</title>
<para>
Die Methode <methodname>SQLite3::lastExtendedErrorCode</methodname> wurde
hinzugefügt, um den letzten erweiterten Ergebniscode abzurufen.
</para>
<para>
<literal>SQLite3::enableExtendedResultCodes($enable = true)</literal> wurde
hinzugefügt, was dazu führt, dass
<methodname>SQLite3::lastErrorCode</methodname> erweiterte Ergebniscodes
zurückgibt.
</para>
</sect2>
<sect2 xml:id="migration74.new-features.standard">
<title>Standard</title>
<sect3 xml:id="migration74.new-features.standard.strip-tags">
<title>strip_tags() mit einem Array von Tag-Namen</title>
<para>
Die Funktion <function>strip_tags</function> akzeptiert nun auch ein Array
mit erlaubten Tags: Anstelle von
<literal>strip_tags($str, '<a><p>')</literal> kann nun
<literal>strip_tags($str, ['a', 'p'])</literal> geschrieben werden.
</para>
</sect3>
<sect3 xml:id="migration74.new-features.standard.magic-serialize">
<title>Benutzerdefinierte Serialisierung von Objekten</title>
<para>
Es wurde ein neues Verfahren für die benutzerdefinierte Serialisierung von
Objekten hinzugefügt, das zwei neue magische Methoden verwendet:
<literal>__serialize</literal> und <literal>__unserialize</literal>.
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
// Gibt ein Array zurück, das alle notwendigen Zustände des Objekts enthält.
public function __serialize(): array
{
}
// Stellt den Objektzustand aus dem angegebenen Datenarray wieder her.
public function __unserialize(array $data): void
{
}
?>
]]>
</programlisting>
</informalexample>
Das neue Serialisierungsverfahren ersetzt die Schnittstelle
<interfacename>Serializable</interfacename>, die in Zukunft für veraltet
erklärt werden wird.
</para>
</sect3>
<sect3 xml:id="migration74.new-features.standard.array-merge-no-args">
<title>Verwendung der array_merge-Funktionen ohne Parameter</title>
<para>
Die Funktionen <function>array_merge</function> und
<function>array_merge_recursive</function> können nun auch ohne Parameter
aufgerufen werden und geben in diesem Fall ein leeres Array zurück. Dies
ist nützlich in Verbindung mit dem Spread-Operator (Zerlegungsoperator),
&zb; <literal>array_merge(...$arrays)</literal>.
</para>
</sect3>
<sect3 xml:id="migration74.new-features.standard.proc-open">
<title>Die Funktion <function>proc_open</function></title>
<para>
<function>proc_open</function> akzeptiert für den Befehl nun ein Array
anstelle einer Zeichenkette. In diesem Fall wird der Prozess direkt
geöffnet (ohne den Umweg über eine Shell) und PHP kümmert sich bei Bedarf
darum, die Parameter zu maskieren.
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
proc_open(['php', '-r', 'echo "Hello World\n";'], $descriptors, $pipes);
?>
]]>
</programlisting>
</informalexample>
</para>
<para>
<function>proc_open</function> unterstützt nun die Deskriptoren
<literal>redirect</literal> und <literal>null</literal>.
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
// Wie 2>&1 in der Shell
proc_open($cmd, [1 => ['pipe', 'w'], 2 => ['redirect', 1]], $pipes);
// Wie 2>/dev/null oder 2>nul in der Shell
proc_open($cmd, [1 => ['pipe', 'w'], 2 => ['null']], $pipes);
?>
]]>
</programlisting>
</informalexample>
</para>
</sect3>
<sect3 xml:id="migration74.new-features.standard.sodium-argon-hash">
<title>argon2i(d) ohne libargon</title>
<para>
Wenn PHP ohne libargon gebaut wird, hat <function>password_hash</function>
nun die argon2i- und argon2id-Implementierungen aus der Erweiterung Sodium.
</para>
</sect3>
</sect2>
</sect1>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->