## Nicht abwärtskompatible Änderungen

### PHP-Kern

#### Interpretation des schließenden Heredoc/Nowdoc-Bezeichners

Durch die Einführung der flexiblen Heredoc/Nowdoc-Syntax können doc-Zeichenketten, die den schließenden Bezeichner in ihrem Körper enthalten, zu Syntaxfehlern oder einer veränderten Interpretation führen. Zum Beispiel in:

`<?php
$str = <<<FOO
abcdefg
FOO
FOO;
?>`
hatte das eingerückte `FOO` bisher keine besondere Bedeutung. Nun wird es als Ende der Heredoc-Zeichenkette interpretiert und das folgende `FOO;` führt zu einem Syntaxfehler. Dieses Problem kann immer gelöst werden, indem ein schließender Bezeichner gewählt wird, der nicht im Inhalt der Zeichenkette vorkommt.

#### Warnung bei continue in switch-Anweisung

Eine `continue`-Anweisung, die in einer `switch`-Kontrollstruktur verwendet wird, erzeugt nun eine Warnung. In PHP sind solche `continue`-Anweisungen gleichbedeutend mit `break`, während sie sich in anderen Sprachen wie `continue 2` verhalten.

`<?php
while ($foo) {
switch ($bar) {
case "baz":
continue;
// Warning: "continue" targeting switch is equivalent to
// "break". Did you mean to use "continue 2"?
}
}
?>`

#### Strikte Interpretation von ganzzahligen Zeichenketten-Schlüsseln bei ArrayAccess

Ein Array-Zugriff vom Typ `$obj["123"]`, worin `$obj` ArrayAccess implementiert und `"123"` ein ganzzahliges Literal vom Typ string ist, führt nicht mehr zu einer impliziten Umwandlung in eine Ganzzahl, d. h., anstelle von `$obj->offsetGet(123)` wird nun `$obj->offsetGet("123")` aufgerufen. Dies entspricht dem bestehenden Verhalten für nicht-literale Werte. Das Verhalten von Arrays wird davon in keiner Weise beeinflusst; sie wandeln ganzzahlige Zeichenketten-Schlüssel weiterhin implizit in Ganzzahlen um.

#### Statische Eigenschaften werden nicht mehr durch Referenzzuweisung getrennt

In PHP werden statische Eigenschaften von vererbenden Klassen gemeinsam genutzt, es sei denn, die statische Eigenschaft wird in einer Kindklasse explizit überschrieben. Allerdings war es aufgrund eines Implementierungs-Artefakts möglich, die statischen Eigenschaften durch Zuweisung einer Referenz zu trennen. Dieses Schlupfloch wurde nun behoben.

`<?php
class Test {
public static $x = 0;
}
class Test2 extends Test { }
Test2::$x = &$x;
$x = 1;
var_dump(Test::$x, Test2::$x);
// Vorher: int(0), int(1)
// Nun: int(1), int(1)
?>`

#### Referenzen, die von Array- und Eigenschafts-Zugriffen zurückgegeben werden, werden sofort aufgelöst

Eine Referenz, die von einem Array- oder Eigenschafts-Zugriff zurückgegeben wird, wird nun im Zuge des Zugriffs aufgelöst. Das bedeutet, dass es nicht mehr möglich ist, die Referenz zwischen dem Zugriff und der Verwendung des Wertes, auf den zugegriffen wurde, zu verändern:

`<?php
$arr = [1];
$ref =& $arr[0];
var_dump($arr[0] + ($arr[0] = 2));
// Vorher: int(4), Nun: int(3)
?>`
Dadurch wird das Verhalten von Referenzen und Nicht-Referenzen konsistent. Es ist zu beachten, dass das Lesen und Schreiben eines Wertes innerhalb eines einzelnen Ausdrucks weiterhin undefiniertes Verhalten bleibt und sich in der Zukunft wieder ändern kann.

#### Entpacken von Parametern bei Traversables mit nicht-ganzzahligen Schlüsseln wird nicht mehr unterstützt

Das Entpacken von Parametern funktioniert bei Traversables mit nicht-ganzzahligen Schlüsseln nicht mehr. Der folgende Code funktionierte in PHP 5.6-7.2 unbeabsichtigt.

`<?php
function foo(...$args) {
var_dump($args);
}
function gen() {
yield 1.23 => 123;
}
foo(...gen());
?>`

#### Verschiedenes

Das Hilfsprogramm ext_skel wurde komplett überarbeitet; neue Optionen wurden hinzugefügt und einige alte Optionen entfernt. Es ist nun in PHP geschrieben und hat keine externen Abhängigkeiten.

Die Unterstützung für BeOS wurde eingestellt.

Exceptions, die im Modus `EH_THROW` durch die automatische Umwandlung von Warnungen in Exceptions ausgelöst werden (z. B. einige DateTime-Exceptions), füllen den Bereich von error_get_last() nicht mehr mit Daten. Damit funktionieren sie nun genauso wie manuell ausgelöste Exceptions.

TypeError meldet nun falsche Typen als `int` und `bool` anstelle von `integer` bzw. `boolean`.

Undefinierte Variablen, die an compact() übergeben werden, werden nun als Hinweis gemeldet.

Die Funktion getimagesize() und verwandte Funktionen melden nun den Mime-Typ von BMP-Bildern als `image/bmp` anstelle von `image/x-ms-bmp`, da ersterer bei der IANA registriert ist (siehe » RFC 7903).

Die Funktion stream_socket_get_name() gibt nun IPv6-Adressen zurück, die in Klammern eingeschlossen sind. Zum Beispiel wird nun `"[::1]:1337"` anstelle von `"::1:1337"` zurückgegeben.

### BCMath mathematische Berechnungen mit beliebiger Genauigkeit

Alle Warnungen, die von BCMath-Funktionen ausgelöst werden, verwenden nun die Fehlerbehandlung von PHP. Zuvor wurden einige Warnungen direkt nach stderr geschrieben.

Die Funktionen bcmul() und bcpow() geben nun Zahlen mit der geforderten Genauigkeit zurück. Zuvor wurden in den zurückgegebenen Zahlen unter Umständen die Dezimalnullen am Ende weggelassen.

### IMAP, POP3 und NNTP

Anmeldungen über rsh/ssh sind standardmäßig deaktiviert. Um dies zu ändern, muss imap.enable_insecure_rsh verwendet werden. Es ist zu beachten, dass die IMAP-Bibliothek die Namen der Postfächer nicht filtert, bevor sie an den rsh/ssh-Befehl übergeben werden. Daher sollten bei aktiviertem rsh/ssh keine nicht vertrauenswürdigen Daten an diesen Befehl übergeben werden.

### Multibyte-Zeichenketten

Aufgrund der hinzugefügten Unterstützung für benannte Teilsuchmuster verhalten sich `mb_ereg_*()`-Suchmuster, die diese verwenden, anders. Insbesondere werden benannte Teilsuchmuster Teil der Treffer sein und mb_ereg_replace() wird die zusätzliche Syntax auswerten. Siehe Benannte Teilsuchmuster für weitere Informationen.

### Verbesserte MySQL-Erweiterung (MySQLi)

Vorbereitete Anweisungen (Prepared Statements) geben die Sekundenbruchteile bei `DATETIME`-, `TIME`- und `TIMESTAMP`-Spalten mit Dezimalspezifizierer (z. B. `TIMESTAMP(6)` bei Verwendung von Mikrosekunden) nun korrekt an. In früheren Versionen wurden sie in den zurückgegebenen Werten einfach weggelassen.

### MySQL-Funktionen (PDO_MYSQL)

Vorbereitete Anweisungen geben die Sekundenbruchteile bei `DATETIME`-, `TIME`- und `TIMESTAMP`-Spalten mit Dezimalspezifizierer (z. B. `TIMESTAMP(6)` bei Verwendung von Mikrosekunden) nun korrekt an. In früheren Versionen wurden sie in den zurückgegebenen Werten einfach weggelassen. Zu beachten ist, dass dies nur die PDO_MYSQL-Anweisungen betrifft, bei denen die Emulation vorbereiteter Anweisungen deaktiviert ist (z. B. bei Verwendung der nativen Prepair-Funktionalität von MySQL). Anweisungen, die Verbindungen mit `PDO::ATTR_EMULATE_PREPARES`=`true` verwenden (die Standardeinstellung), waren von dem behobenen Fehler nicht betroffen und erhielten bereits korrekte Sekundenbruchteile von der Engine.

### Reflection

Beim Exportieren von Reflection-Objekten in Zeichenketten werden nun `int` und `bool` anstelle von `integer` bzw. `boolean` verwendet.

### Standard-PHP-Bibliothek (SPL)

Wenn ein SPL-Autoloader eine Exception auslöst, werden die folgenden Autoloader nicht mehr ausgeführt. Zuvor wurden alle Autoloader ausgeführt und die Exceptions wurden verkettet.

### SimpleXML

Wenn eine mathematische Operation ein SimpleXML-Objekt enthält, wird der Text nun als int oder float behandelt, je nachdem, was besser geeignet ist. Zuvor wurden Werte grundsätzlich als ints behandelt.

### Eingehende Cookies

Seit PHP 7.3.23 werden die Namen eingehender Cookies aus Sicherheitsgründen nicht mehr URL-dekodiert.

`↑` and `↓` to navigate • `Enter` to select • `Esc` to close • `/` to open