|
| 1 | +<?xml version="1.0" encoding="utf-8"?> |
| 2 | +<!-- $Revision$ --> |
| 3 | +<!-- EN-Revision: 6f41560bf19de74e2dfbc78f4175d35f5b378abe Maintainer: samesch Status: ready --> |
| 4 | + |
| 5 | +<sect1 xml:id="migration74.incompatible" xmlns:xlink="http://www.w3.org/1999/xlink"> |
| 6 | + <title>Nicht abwärtskompatible Änderungen</title> |
| 7 | + |
| 8 | + <sect2 xml:id="migration74.incompatible.core"> |
| 9 | + <title>PHP-Kern</title> |
| 10 | + |
| 11 | + <sect3 xml:id="migration74.incompatible.core.non-array-access"> |
| 12 | + <title>Zugriff auf Nicht-Arrays im Array-Stil</title> |
| 13 | + |
| 14 | + <para> |
| 15 | + Der Versuch, Werte vom Typ <type>null</type>, <type>bool</type>, |
| 16 | + <type>int</type>, <type>float</type> oder <type>resource</type> wie ein |
| 17 | + Array zu verwenden, (z. B. <literal>$null["key"]</literal>) erzeugt nun |
| 18 | + einen Hinweis. |
| 19 | + </para> |
| 20 | + </sect3> |
| 21 | + |
| 22 | + <sect3 xml:id="migration74.incompatible.core.get-declared-classes"> |
| 23 | + <title>Die Funktion <function>get_declared_classes</function></title> |
| 24 | + |
| 25 | + <para> |
| 26 | + <function>get_declared_classes</function> gibt keine anonymen Klassen mehr |
| 27 | + zurück, die noch nicht instanziiert wurden. |
| 28 | + </para> |
| 29 | + </sect3> |
| 30 | + |
| 31 | + <sect3 xml:id="migration74.incompatible.core.fn"> |
| 32 | + <title>Das Schlüsselwort <literal>fn</literal></title> |
| 33 | + |
| 34 | + <para> |
| 35 | + <literal>fn</literal> ist nun ein reserviertes Schlüsselwort. Insbesondere |
| 36 | + kann es nicht mehr als Funktions- oder Klassenname verwendet werden. |
| 37 | + Es kann weiterhin als Name einer Methode oder Klassenkonstante verwendet |
| 38 | + werden. |
| 39 | + </para> |
| 40 | + </sect3> |
| 41 | + |
| 42 | + <sect3 xml:id="migration74.incompatible.core.php-tag"> |
| 43 | + <title><literal><?php</literal>-Tag am Ende der Datei</title> |
| 44 | + |
| 45 | + <para> |
| 46 | + Das Tag <literal><?php</literal> am Ende der Datei (ohne nachgestellten |
| 47 | + Zeilenumbruch) wird nun als ein öffnendes PHP-Tag interpretiert. Zuvor |
| 48 | + wurde es entweder als kurzes öffnendes Tag gefolgt vom Literal |
| 49 | + <literal>php</literal> interpretiert und führte zu einem Syntaxfehler (bei |
| 50 | + <literal>short_open_tag=1</literal>) oder es wurde als literale |
| 51 | + Zeichenkette <literal><?php</literal> interpretiert (bei |
| 52 | + <literal>short_open_tag=0</literal>). |
| 53 | + </para> |
| 54 | + </sect3> |
| 55 | + |
| 56 | + <sect3 xml:id="migration74.incompatible.core.stream-wrappers"> |
| 57 | + <title>Stream-Wrapper</title> |
| 58 | + |
| 59 | + <para> |
| 60 | + Wenn include/require für einen Stream verwendet wird, wird |
| 61 | + <methodname>streamWrapper::stream_set_option</methodname> mit der Option |
| 62 | + <constant>STREAM_OPTION_READ_BUFFER</constant> aufgerufen. Bei einem |
| 63 | + benutzerdefinierten Stream-Wrapper kann es notwendig sein, die Methode |
| 64 | + <methodname>streamWrapper::stream_set_option</methodname> zu |
| 65 | + implementieren, um eine Warnung zu vermeiden (eine Implementierung, die |
| 66 | + immer &false; zurückgibt, ist normalerweise ausreichend). |
| 67 | + </para> |
| 68 | + </sect3> |
| 69 | + |
| 70 | + <sect3 xml:id="migration74.incompatible.core.serialization"> |
| 71 | + <title>Serialisierung</title> |
| 72 | + |
| 73 | + <para> |
| 74 | + Das Serialisierungsformat <literal>o</literal> wurde entfernt. Da es von |
| 75 | + PHP nie erzeugt wurde, kann dies nur die Deserialisierung von manuell |
| 76 | + erstellten Zeichenketten beeinträchtigen. |
| 77 | + </para> |
| 78 | + </sect3> |
| 79 | + |
| 80 | + <sect3 xml:id="migration74.incompatible.core.password-algorithm-constants"> |
| 81 | + <title>Konstanten für den Passwort-Algorithmus</title> |
| 82 | + |
| 83 | + <para> |
| 84 | + Die Bezeichner der Algorithmen für das Hashing von Passwörtern sind nun |
| 85 | + keine Ganzzahlen mehr, sondern nullbare Zeichenketten. |
| 86 | + </para> |
| 87 | + |
| 88 | + <itemizedlist> |
| 89 | + <listitem> |
| 90 | + <simpara> |
| 91 | + <constant>PASSWORD_DEFAULT</constant> war int 1 und ist nun &null; |
| 92 | + </simpara> |
| 93 | + </listitem> |
| 94 | + <listitem> |
| 95 | + <simpara> |
| 96 | + <constant>PASSWORD_BCRYPT</constant> war int 1 und ist nun '2y' |
| 97 | + </simpara> |
| 98 | + </listitem> |
| 99 | + <listitem> |
| 100 | + <simpara> |
| 101 | + <constant>PASSWORD_ARGON2I</constant> war int 2 und ist nun 'argon2i' |
| 102 | + </simpara> |
| 103 | + </listitem> |
| 104 | + <listitem> |
| 105 | + <simpara> |
| 106 | + <constant>PASSWORD_ARGON2ID</constant> war int 3 und ist nun 'argon2id' |
| 107 | + </simpara> |
| 108 | + </listitem> |
| 109 | + </itemizedlist> |
| 110 | + |
| 111 | + <para> |
| 112 | + Anwendungen, die die Konstanten PASSWORD_DEFAULT, PASSWORD_BCRYPT, |
| 113 | + PASSWORD_ARGON2I und PASSWORD_ARGON2ID korrekt verwenden, werden weiterhin |
| 114 | + korrekt funktionieren. |
| 115 | + </para> |
| 116 | + </sect3> |
| 117 | + |
| 118 | + <sect3 xml:id="migration74.incompatible.core.htmlentities"> |
| 119 | + <title>Die Funktion <function>htmlentities</function></title> |
| 120 | + |
| 121 | + <para> |
| 122 | + <function>htmlentities</function> erzeugt nun einen Hinweis (anstelle |
| 123 | + einer Warnung wegen strikter Standards), wenn sie mit einer Kodierung |
| 124 | + verwendet wird, bei der nur die Substitution von Basisentitäten |
| 125 | + unterstützt wird. In diesem Fall entspricht das der Funktion |
| 126 | + <function>htmlspecialchars</function>. |
| 127 | + </para> |
| 128 | + </sect3> |
| 129 | + |
| 130 | + <sect3 xml:id="migration74.incompatible.core.fread-fwrite"> |
| 131 | + <title>Die Funktionen <function>fread</function> und <function>fwrite</function></title> |
| 132 | + |
| 133 | + <para> |
| 134 | + <function>fread</function> und <function>fwrite</function> geben nun |
| 135 | + &false; zurück, wenn die Operation fehlgeschlagen ist; zuvor wurde eine |
| 136 | + leere Zeichenkette oder 0 zurückgegeben. EAGAIN/EWOULDBLOCK werden nicht |
| 137 | + als Fehler gewertet. |
| 138 | + </para> |
| 139 | + <para> |
| 140 | + Diese Funktionen geben nun auch bei Fehlern eine Meldung aus, z. B. wenn |
| 141 | + versucht wird, in eine schreibgeschützte Dateiressource zu schreiben. |
| 142 | + </para> |
| 143 | + </sect3> |
| 144 | + |
| 145 | + </sect2> |
| 146 | + |
| 147 | + <sect2 xml:id="migration74.incompatible.bcmath"> |
| 148 | + <title>BCMath mathematische Berechnungen mit beliebiger Genauigkeit</title> |
| 149 | + |
| 150 | + <para> |
| 151 | + BCMath-Funktionen erzeugen nun eine Warnung, wenn eine nicht wohlgeformte |
| 152 | + Zahl übergeben wird, z. B. <literal>"32foo"</literal>. Der Parameter wird |
| 153 | + wie bisher als Null interpretiert. |
| 154 | + </para> |
| 155 | + </sect2> |
| 156 | + |
| 157 | + <sect2 xml:id="migration74.incompatible.curl"> |
| 158 | + <title>CURL</title> |
| 159 | + |
| 160 | + <para> |
| 161 | + Der Versuch, eine <classname>CURLFile</classname>-Klasse zu serialisieren, |
| 162 | + erzeugt nun eine Exception. Zuvor wurde die Exception nur bei der |
| 163 | + Deserialisierung ausgelöst. |
| 164 | + </para> |
| 165 | + <para> |
| 166 | + Die Verwendung von <constant>CURLPIPE_HTTP1</constant> ist veraltet und |
| 167 | + wird ab cURL 7.62.0 nicht mehr unterstützt. |
| 168 | + </para> |
| 169 | + <para> |
| 170 | + Bei der Funktion <function>curl_version</function> ist der Parameter |
| 171 | + <literal>$version</literal> veraltet. Wenn ein anderer Wert als der |
| 172 | + Standardwert <constant>CURLVERSION_NOW</constant> übergeben wird, wird eine |
| 173 | + Warnung ausgegeben und der Parameter wird ignoriert. |
| 174 | + </para> |
| 175 | + </sect2> |
| 176 | + |
| 177 | + <sect2 xml:id="migration74.incompatible.datetime"> |
| 178 | + <title>Datum und Uhrzeit</title> |
| 179 | + |
| 180 | + <para> |
| 181 | + Der Aufruf von <function>var_dump</function> oder ähnlichem mit einer |
| 182 | + Instanz von <classname>DateTime</classname> oder |
| 183 | + <classname>DateTimeImmutable</classname> hinterlässt keine verfügbaren |
| 184 | + Eigenschaften des Objekts mehr. |
| 185 | + </para> |
| 186 | + <para> |
| 187 | + Der Vergleich von <classname>DateInterval</classname>-Objekten (mittels |
| 188 | + <literal>==</literal>, <literal><</literal> usw.) erzeugt nun eine |
| 189 | + Warnung und gibt immer &false; zurück. Zuvor wurden alle |
| 190 | + <classname>DateInterval</classname>-Objekte als gleich angesehen, sofern |
| 191 | + sie keine Eigenschaften hatten. |
| 192 | + </para> |
| 193 | + </sect2> |
| 194 | + |
| 195 | + <sect2 xml:id="migration74.incompatible.intl"> |
| 196 | + <title>Intl</title> |
| 197 | + |
| 198 | + <para> |
| 199 | + Bei den Funktionen <function>idn_to_ascii</function> und |
| 200 | + <function>idn_to_utf8</function> ist der Standardwert des Parameters nun |
| 201 | + <constant>INTL_IDNA_VARIANT_UTS46</constant> anstelle des veralteten |
| 202 | + <constant>INTL_IDNA_VARIANT_2003</constant>. |
| 203 | + </para> |
| 204 | + </sect2> |
| 205 | + |
| 206 | + <sect2 xml:id="migration74.incompatible.mysqli"> |
| 207 | + <title>MySQLi</title> |
| 208 | + |
| 209 | + <para> |
| 210 | + Die integrierte Serverfunktionalität wurde entfernt. Sie war seit |
| 211 | + mindestens PHP 7.0 fehlerhaft. |
| 212 | + </para> |
| 213 | + <para> |
| 214 | + Die undokumentierte Eigenschaft <literal>mysqli::$stat</literal> wurde |
| 215 | + zugunsten von <methodname>mysqli::stat</methodname> entfernt. |
| 216 | + </para> |
| 217 | + </sect2> |
| 218 | + |
| 219 | + <sect2 xml:id="migration74.incompatible.openssl"> |
| 220 | + <title>OpenSSL</title> |
| 221 | + |
| 222 | + <para> |
| 223 | + Die Funktion <function>openssl_random_pseudo_bytes</function> löst nun |
| 224 | + ähnlich wie <function>random_bytes</function> bei Fehlern eine Exception |
| 225 | + aus. Insbesondere wird ein <classname>Error</classname> ausgelöst, wenn die |
| 226 | + Anzahl der angeforderten Bytes kleiner oder gleich Null ist, und eine |
| 227 | + <classname>Exception</classname> wird ausgelöst, wenn nicht genügend |
| 228 | + Zufallsdaten gesammelt werden können. Wenn die Funktion nicht auslöst, ist |
| 229 | + der Parameter <literal>$crypto_strong output</literal> garantiert immer |
| 230 | + &true;, weshalb eine explizite Überprüfung nicht nötig ist. |
| 231 | + </para> |
| 232 | + </sect2> |
| 233 | + |
| 234 | + <sect2 xml:id="migration74.incompatible.pcre"> |
| 235 | + <title>Reguläre Ausdrücke (Perl-kompatibel)</title> |
| 236 | + |
| 237 | + <para> |
| 238 | + Wenn der Modus <constant>PREG_UNMATCHED_AS_NULL</constant> verwendet wird, |
| 239 | + werden nicht gefundene Teilsuchmuster nun auch auf &null; gesetzt (oder |
| 240 | + <literal>[null, -1]</literal>, wenn die Erfassung des Offsets aktiviert |
| 241 | + ist). Das bedeutet, dass die Größe der <literal>$matches</literal> |
| 242 | + (Übereinstimmungen) immer gleich ist. |
| 243 | + </para> |
| 244 | + </sect2> |
| 245 | + |
| 246 | + <sect2 xml:id="migration74.incompatible.pdo"> |
| 247 | + <title>PHP-Datenobjekte (PDO)</title> |
| 248 | + |
| 249 | + <para> |
| 250 | + Der Versuch, eine Instanz von <classname>PDO</classname> oder |
| 251 | + <classname>PDOStatement</classname> zu serialisieren, erzeugt nun eine |
| 252 | + <classname>Exception</classname> anstelle einer |
| 253 | + <classname>PDOException</classname>, was dem Verhalten anderer interner |
| 254 | + Klassen entspricht, die keine Serialisierung unterstützen. |
| 255 | + </para> |
| 256 | + </sect2> |
| 257 | + |
| 258 | + <sect2 xml:id="migration74.incompatible.reflection"> |
| 259 | + <title>Reflection</title> |
| 260 | + |
| 261 | + <para> |
| 262 | + Reflection-Objekte erzeugen nun eine Exception, wenn versucht wird, sie zu |
| 263 | + serialisieren. Die Serialisierung von Reflection-Objekten wurde nie |
| 264 | + unterstützt und führte zu beschädigten Reflection-Objekten. Sie ist nun |
| 265 | + ausdrücklich verboten. |
| 266 | + </para> |
| 267 | + |
| 268 | + <para> |
| 269 | + Die Werte der Klassenkonstanten von |
| 270 | + <classname>ReflectionClassConstant</classname>, |
| 271 | + <classname>ReflectionMethod</classname> und |
| 272 | + <classname>ReflectionProperty</classname> haben sich geändert. |
| 273 | + </para> |
| 274 | + </sect2> |
| 275 | + |
| 276 | + <sect2 xml:id="migration74.incompatible.spl"> |
| 277 | + <title>Standard-PHP-Bibliothek (SPL)</title> |
| 278 | + |
| 279 | + <para> |
| 280 | + Wenn die Funktion <function>get_object_vars</function> für eine Instanz von |
| 281 | + <classname>ArrayObject</classname> aufgerufen wird, gibt sie nun immer die |
| 282 | + Eigenschaften der Klasse <classname>ArrayObject</classname> selbst (oder |
| 283 | + einer Unterklasse) zurück. Zuvor wurden die Werte des betreffenden |
| 284 | + Arrays/Objekts zurückgegeben, es sei denn, das Flag |
| 285 | + <constant>ArrayObject::STD_PROP_LIST</constant> wurde angegeben. |
| 286 | + </para> |
| 287 | + <para> |
| 288 | + Andere betroffene Operationen sind: |
| 289 | + </para> |
| 290 | + <itemizedlist> |
| 291 | + <listitem> |
| 292 | + <simpara> |
| 293 | + Die Methode <methodname>ReflectionObject::getProperties</methodname> |
| 294 | + </simpara> |
| 295 | + </listitem> |
| 296 | + <listitem> |
| 297 | + <simpara> |
| 298 | + Die Funktionen <function>reset</function>, <function>current</function> |
| 299 | + usw. Stattdessen sollten die Methoden von |
| 300 | + <interfacename>Iterator</interfacename> verwendet werden. |
| 301 | + </simpara> |
| 302 | + </listitem> |
| 303 | + <listitem> |
| 304 | + <simpara> |
| 305 | + Möglicherweise andere, die Objekteigenschaften als Liste bearbeiten, |
| 306 | + z. B. die Funktion <function>array_walk</function>. |
| 307 | + </simpara> |
| 308 | + </listitem> |
| 309 | + </itemizedlist> |
| 310 | + <para> |
| 311 | + Typumwandlungen mit <literal>(array)</literal> sind davon nicht betroffen. |
| 312 | + Sie geben weiterhin entweder das betreffende Array oder die Eigenschaften |
| 313 | + der Klasse <classname>ArrayObject</classname> zurück, je nachdem ob das |
| 314 | + Flag <constant>ArrayObject::STD_PROP_LIST</constant> verwendet wird. |
| 315 | + </para> |
| 316 | + <para> |
| 317 | + Die Methode <methodname>SplPriorityQueue::setExtractFlags</methodname> löst |
| 318 | + eine Exception aus, wenn Null (<literal>0</literal>) übergeben wird. Zuvor |
| 319 | + erzeugte dies bei der nächsten Extraktionsoperation einen behebbaren |
| 320 | + schwerwiegenden Fehler. |
| 321 | + </para> |
| 322 | + <para> |
| 323 | + Die Klassen <classname>ArrayObject</classname>, |
| 324 | + <classname>ArrayIterator</classname>, |
| 325 | + <classname>SplDoublyLinkedList</classname> und |
| 326 | + <classname>SplObjectStorage</classname> unterstützen nun zusätzlich zur |
| 327 | + Schnittstelle <interfacename>Serializable</interfacename> das Verfahren |
| 328 | + <literal>__serialize()</literal> und <literal>__unserialize()</literal>. |
| 329 | + Das bedeutet, dass die mit älteren PHP-Versionen serialisierten Daten immer |
| 330 | + noch deserialisiert werden können, aber Daten, die mit PHP 7.4 erstellt |
| 331 | + wurden, von älteren Versionen nicht verstanden werden. |
| 332 | + </para> |
| 333 | + </sect2> |
| 334 | + |
| 335 | + <sect2 xml:id="migration74.incompatible.tokenizer"> |
| 336 | + <title>Tokenizer</title> |
| 337 | + |
| 338 | + <para> |
| 339 | + Die Funktion <function>token_get_all</function> gibt für unerwartete |
| 340 | + Zeichen nun ein <constant>T_BAD_CHARACTER</constant>-Token aus, anstatt |
| 341 | + Löcher im Token-Stream zu hinterlassen. |
| 342 | + </para> |
| 343 | + </sect2> |
| 344 | + |
| 345 | + <sect2 xml:id="migration74.incompatible.cookie-decode"> |
| 346 | + <title>Eingehende Cookies</title> |
| 347 | + |
| 348 | + <para> |
| 349 | + Seit PHP 7.4.11 werden die <emphasis>Namen</emphasis> der eingehenden |
| 350 | + Cookies aus Sicherheitsgründen nicht mehr URL-dekodiert. |
| 351 | + </para> |
| 352 | + </sect2> |
| 353 | + |
| 354 | +</sect1> |
| 355 | + |
| 356 | +<!-- Keep this comment at the end of the file |
| 357 | +Local variables: |
| 358 | +mode: sgml |
| 359 | +sgml-omittag:t |
| 360 | +sgml-shorttag:t |
| 361 | +sgml-minimize-attributes:nil |
| 362 | +sgml-always-quote-attributes:t |
| 363 | +sgml-indent-step:1 |
| 364 | +sgml-indent-data:t |
| 365 | +indent-tabs-mode:nil |
| 366 | +sgml-parent-document:nil |
| 367 | +sgml-default-dtd-file:"~/.phpdoc/manual.ced" |
| 368 | +sgml-exposed-tags:nil |
| 369 | +sgml-local-catalogs:nil |
| 370 | +sgml-local-ecat-files:nil |
| 371 | +End: |
| 372 | +vim600: syn=xml fen fdm=syntax fdl=2 si |
| 373 | +vim: et tw=78 syn=sgml |
| 374 | +vi: ts=1 sw=1 |
| 375 | +--> |
0 commit comments