-
Notifications
You must be signed in to change notification settings - Fork 39
/
incompatible.xml
425 lines (384 loc) · 14.7 KB
/
incompatible.xml
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
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: 497c40ac164d5873fd87f622dfdeb5206392b446 Maintainer: samesch Status: ready -->
<sect1 xml:id="migration81.incompatible" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>Nicht abwärtskompatible Änderungen</title>
<sect2 xml:id="migration81.incompatible.core">
<title>PHP Core</title>
<sect3 xml:id="migration81.incompatible.core.globals-access">
<title>Zugriffsbeschränkungen für $GLOBALS</title>
<para>
Der Zugriff auf das Array <varname>$GLOBALS</varname> unterliegt nun einer
einer Reihe von Einschränkungen. Der Lese- und Schreibzugriff auf einzelne
Array-Elemente wie <code>$GLOBALS['var']</code> funktioniert weiterhin wie
bisher. Der nur lesende Zugriff auf das Gesamt-Array
<varname>$GLOBALS</varname> wird ebenfalls wird weiterhin unterstützt.
Allerdings wird der Schreibzugriff auf das Gesamt-Array
<varname>$GLOBALS</varname> nicht mehr unterstützt. Zum Beispiel wird
<code>array_pop($GLOBALS)</code> zu einem Fehler führen.
</para>
</sect3>
<sect3 xml:id="migration81.incompatible.core.static-variable-inheritance">
<title>
Verwendung von <modifier>static</modifier>-Variablen in geerbten Methoden
</title>
<para>
Wenn eine Methode, die statische Variablen verwendet, geerbt (aber nicht
überschrieben) wird, teilt die geerbte Methode nun die statischen
Variablen mit der Methode der Elternklasse.
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
class A {
public static function counter() {
static $counter = 0;
$counter++;
return $counter;
}
}
class B extends A {}
var_dump(A::counter()); // int(1)
var_dump(A::counter()); // int(2)
var_dump(B::counter()); // int(3), vorher int(1)
var_dump(B::counter()); // int(4), vorher int(2)
?>
]]>
</programlisting>
</informalexample>
Das bedeutet, dass sich statische Variablen in Methoden nun genauso
verhalten wie statische Eigenschaften.
</para>
</sect3>
<sect3 xml:id="migration81.incompatible.core.optional-before-required">
<title>Angabe optionaler Parameter vor den erforderlichen</title>
<para>
Ein <link linkend="functions.arguments.default">optionaler Parameter</link>,
der vor den erforderlichen Parametern angegeben wird, wird nun immer als
erforderlich angesehen. Dies ist auch der Fall, wenn eine Funktion mit
<link linkend="functions.named-arguments">benannten Parametern</link>
aufgerufen wird. Seit PHP 8.0.0, aber vor PHP 8.1.0, löst das untenstehende
Beispiel einen Hinweis darauf aus, dass die Definition veraltet ist, läuft
aber beim Aufruf trotzdem fehlerfrei. Ab PHP 8.1.0 wird ein Fehler der
Klasse <classname>ArgumentCountError</classname> ausgelöst, so wie es auch
bei einem Aufruf mit positionsbezogenen Parametern der Fall wäre.
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
function makeyogurt($container = "bowl", $flavour)
{
return "Making a $container of $flavour yogurt.\n";
}
try
{
echo makeyogurt(flavour: "raspberry");
}
catch (Error $e)
{
echo get_class($e), ' - ', $e->getMessage(), "\n";
}
?>
]]>
</programlisting>
&example.outputs.80;
<screen>
<![CDATA[
Deprecated: Required parameter $flavour follows optional parameter $container
in example.php on line 3
Making a bowl of raspberry yogurt.
]]>
</screen>
&example.outputs.81;
<screen>
<![CDATA[
Deprecated: Optional parameter $container declared before required parameter
$flavour is implicitly treated as a required parameter in example.php on line 3
ArgumentCountError - makeyogurt(): Argument #1 ($container) not passed
]]>
</screen>
</informalexample>
</para>
<para>
Es ist zu beachten, dass ein Standardwert von &null; vor erforderlichen
Parametern verwendet werden kann, um einen
<link linkend="language.types.declarations.nullable">nullbaren Typ</link>
anzugeben, aber der Parameter wird trotzdem benötigt.
</para>
</sect3>
<sect3 xml:id="migration81.incompatible.core.type-compatibility-internal">
<title>Kompatibilität des Rückgabetyps mit internen Klassen</title>
<para>
Die meisten nicht-finalen internen Methoden erfordern nun, dass
überschreibende Methoden einen kompatiblen Rückgabetyp deklarieren,
andernfalls wird bei der Vererbungsüberprüfung ein Hinweis darauf
ausgegeben, dass die Funktionsweise veraltet ist. Falls der Rückgabetyp
aufgrund von Kompatibilitätsproblemen zwischen PHP-Versionen für eine
überschreibende Methode nicht deklariert werden kann, kann das Attribut
<classname>ReturnTypeWillChange</classname> hinzugefügt werden, um den
Veraltet-Hinweis zu unterdrücken.
</para>
</sect3>
<sect3 xml:id="migration81.incompatible.core.new-keywords">
<title>Neue Schlüsselwörter</title>
<para>
<literal>readonly</literal> ist nun ein Schlüsselwort. Es kann jedoch
weiterhin als Name einer Funktion verwendet werden.
</para>
<para>
<literal>never</literal> ist nun ein reserviertes Wort, sodass es nicht verwendet werden kann,
um eine Klasse, eine Schnittstelle oder einen Trait zu benennen,
und es darf auch nicht in Namespaces verwendet werden.
</para>
</sect3>
</sect2>
<sect2 xml:id="migration81.incompatible.resource2object">
<title>Umstellung von Ressourcen auf Objekte</title>
<para>
Mehrere &resource;n wurden zu &object;en migriert.
Rückgabewertprüfungen mit <function>is_resource</function> sollten durch
Prüfungen auf &false; ersetzt werden.
</para>
<itemizedlist>
<listitem>
<para>
Die <link linkend="book.fileinfo">FileInfo</link>-Funktionen akzeptieren
nun <classname>finfo</classname>-Objekte anstelle von
<literal>fileinfo</literal>-&resource;n und geben diese auch zurück.
</para>
</listitem>
<listitem>
<para>
Die <link linkend="book.ftp">FTP</link>-Funktionen akzeptieren nun
<classname>FTP\Connection</classname>-Objekte anstelle von
<literal>ftp</literal>-&resource;n und geben diese auch zurück.
</para>
</listitem>
<listitem>
<para>
Die <link linkend="book.imap">IMAP</link>-Funktionen akzeptieren nun
<classname>IMAP\Connection</classname>-Objekte anstelle von
<literal>imap</literal>-&resource;n und geben diese auch zurück.
</para>
</listitem>
<listitem>
<para>
Die <link linkend="book.ldap">LDAP</link>-Funktionen akzeptieren nun
<classname>LDAP\Connection</classname>-Objekte anstelle von
<literal>ldap link</literal>-&resource;n und geben diese auch zurück.
</para>
</listitem>
<listitem>
<para>
Die <link linkend="book.ldap">LDAP</link>-Funktionen akzeptieren nun
<classname>LDAP\Result</classname>-Objekte anstelle von
<literal>ldap result</literal>-&resource;n und geben diese auch zurück.
</para>
</listitem>
<listitem>
<para>
Die <link linkend="book.ldap">LDAP</link>-Funktionen akzeptieren nun
<classname>LDAP\ResultEntry</classname>-Objekte anstelle von
<literal>ldap result entry</literal>-&resource;n und geben diese auch
zurück.
</para>
</listitem>
<listitem>
<para>
Die <link linkend="book.pgsql">PgSQL</link>-Funktionen akzeptieren nun
<classname>PgSql\Connection</classname>-Objekte anstelle von
<literal>pgsql link</literal>-&resource;n und geben diese auch zurück.
</para>
</listitem>
<listitem>
<para>
Die <link linkend="book.pgsql">PgSQL</link>-Funktionen akzeptieren nun
<classname>PgSql\Result</classname>-Objekte anstelle von
<literal>pgsql result</literal>-&resource;n und geben diese auch zurück.
</para>
</listitem>
<listitem>
<para>
Die <link linkend="book.pgsql">PgSQL</link>-Funktionen akzeptieren nun
<classname>PgSql\Lob</classname>-Objekte anstelle von
<literal>pgsql large object</literal>-&resource;n und geben diese auch
zurück.
</para>
</listitem>
<listitem>
<para>
Die <link linkend="book.pspell">PSpell</link>-Funktionen akzeptieren nun
<classname>PSpell\Dictionary</classname>-Objekte anstelle von
<literal>pspell</literal>-&resource;n und geben diese auch zurück.
</para>
</listitem>
<listitem>
<para>
Die <link linkend="book.pspell">PSpell</link>-Funktionen akzeptieren nun
<classname>PSpell\Config</classname>-Objekte anstelle von
<literal>pspell config</literal>-&resource;n und geben diese auch zurück.
</para>
</listitem>
</itemizedlist>
</sect2>
<sect2 xml:id="migration81.incompatible.mysqli">
<title>MySQLi</title>
<para>
<function>mysqli_fetch_fields</function> und
<function>mysqli_fetch_field_direct</function> geben nun bei der
Eigenschaft <property>max_length</property> immer <literal>0</literal>
zurück. Dieser Wert kann berechnet werden, indem die Ergebnismenge in einer
Schleife durchlaufen und die maximale Länge ermittlt wird. Dies ist der
Algorithmus, den PHP zuvor intern verwendet hat.
</para>
<para>
Die Option <constant>MYSQLI_STMT_ATTR_UPDATE_MAX_LENGTH</constant> hat
keine Auswirkung mehr.
</para>
<para>
Die Option <constant>MYSQLI_STORE_RESULT_COPY_DATA</constant> hat keine
Auswirkung mehr. Die Übergabe eines beliebigen Wertes an den
<parameter>mode</parameter>-Parameter von
<methodname>mysqli::store_result</methodname> hat keine Auswirkung mehr.
</para>
<para>
<methodname>mysqli::connect</methodname> gibt bei Erfolg nun &true;
anstelle von &null; zurück.
</para>
<para>
Der Standard-Fehlerbehandlungsmodus wurde von "silent" auf "exceptions"
geändert. Siehe die Seite
<link linkend="mysqli-driver.report-mode">MySQLi-Berichtsmodus</link> für
weitere Details darüber, was das bedeutet, und wie man dieses Attribut
explizit setzt. Um das vorherige Verhalten wiederherzustellen, kann
folgendes verwendet werden: <code>mysqli_report(MYSQLI_REPORT_OFF);</code>
</para>
<para>
Klassen, die <methodname>mysqli_stmt::execute</methodname> erweitern,
müssen nun den zusätzlichen optionalen Parameter angeben.
</para>
</sect2>
<sect2 xml:id="migration81.incompatible.mysqlnd">
<title>MySQLnd</title>
<para>
Die INI-Direktive
<link linkend="ini.mysqlnd.fetch_data_copy">mysqlnd.fetch_data_copy</link>
wurde entfernt. Dies sollte zu keinen für den Benutzer sichtbaren
Verhaltensänderungen führen.
</para>
</sect2>
<sect2 xml:id="migration81.incompatible.openssl">
<title>OpenSSL</title>
<para>
Private EC-Schlüssel werden jetzt wie alle anderen Schlüssel im
<acronym>PKCS</acronym>#8-Format statt im traditionellen Format exportiert.
</para>
<para>
<function>openssl_pkcs7_encrypt</function> und
<function>openssl_cms_encrypt</function> verwenden nun standardmäßig
AES-128-CBC anstelle von RC2-40. Die RC2-40-Chiffre gilt als unsicher und
wird von OpenSSL 3 standardmäßig nicht aktiviert.
</para>
</sect2>
<sect2 xml:id="migration81.incompatible.pdo">
<title>PHP-Datenobjekte</title>
<para>
<constant>PDO::ATTR_STRINGIFY_FETCHES</constant> wandelt nun Werte vom Typ
&boolean; in <literal>"0"</literal> oder <literal>"1"</literal> um. Zuvor
wurden &boolean;s nicht stringifiziert.
</para>
<para>
Wenn <constant>PDO::ATTR_STRINGIFY_FETCHES</constant> nicht aktiviert ist,
Bindet der Aufruf von <methodname>PDOStatement::bindColumn</methodname> mit
<constant>PDO::PARAM_LOB</constant> das Ergebnis eines Streams nun
dauerhaft ein. Zuvor war das Ergebnis entweder ein Stream oder eine
Zeichenkette, je nach verwendetem Datenbanktreiber und dem Zeitpunkt der
Bindung.
</para>
<sect3 xml:id="migration81.incompatible.pdo.mysql">
<title>MySQL-Treiber</title>
<para>
Integer- und Float-Werte in Ergebnismengen werden nun als native PHP-Typen
anstelle von &string;s zurückgegeben, wenn emulierte vorbereitete
Anweisungen verwendet werden. Dies entspricht dem Verhalten von nativen
vorbereiteten Anweisungen. Das vorherige Verhalten kann wiederhergestellt
werden, indem die Option <constant>PDO::ATTR_STRINGIFY_FETCHES</constant>
aktiviert wird.
</para>
</sect3>
<sect3 xml:id="migration81.incompatible.pdo.sqlite">
<title>SQLite-Treiber</title>
<para>
Integer- und Float-Werte in Ergebnismengen werden nun als native PHP-Typen
zurückgegeben. Das vorherige Verhalten kann wiederhergestellt werden,
indem die Option <constant>PDO::ATTR_STRINGIFY_FETCHES</constant>
aktiviert wird.
</para>
</sect3>
</sect2>
<sect2 xml:id="migration81.incompatible.phar">
<title>Phar</title>
<para>
Um der <interfacename>ArrayAccess</interfacename>-Schnittstelle zu
entsprechen, geben <methodname>Phar::offsetUnset</methodname> und
<methodname>PharData::offsetUnset</methodname> keinen &boolean;-Wert mehr
zurück.
</para>
</sect2>
<sect2 xml:id="migration81.incompatible.standard">
<title>Standardfunktionen</title>
<para>
<function>version_compare</function> akzeptiert keine undokumentierten
Operator-Abkürzungen mehr.
</para>
<para>
<function>htmlspecialchars</function>,
<function>htmlentities</function>,
<function>htmlspecialchars_decode</function>,
<function>html_entity_decode</function>
und <function>get_html_translation_table</function>
verwenden nun standardmäßig <literal>ENT_QUOTES | ENT_SUBSTITUTE</literal>
anstelle von <constant>ENT_COMPAT</constant>. Das bedeutet, dass
<literal>'</literal> zu <literal>&#039;</literal> umgewandelt wird,
während vorher nichts geändert wurde. Darüber hinaus werden fehlerhafte
UTF-8-Zeichen durch ein Unicode-Ersatzzeichen ersetzt und nicht mehr durch
eine leere Zeichenkette.
</para>
<para>
<function>debug_zval_dump</function> gibt nun nicht nur den eigenen
Referenzzähler aus, sondern auch den Referenzzähler des Referenz-Wrappers,
anstatt dem Wert ein <literal>&</literal> voranzustellen. Dies ist ein
genaueres Modell der Referenzdarstellung seit PHP 7.0.
</para>
<para>
<function>debug_zval_dump</function> gibt für festgelegte Zeichenketten und
unveränderliche Arrays nun <literal>interned</literal> aus.
</para>
</sect2>
<sect2 xml:id="migration81.incompatible.spl">
<title>Standard-PHP-Bibliothek (SPL)</title>
<para>
<classname>SplFixedArray</classname> wird nun wie ein &array; in JSON
kodiert.
</para>
</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
-->