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;
?>
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.
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"?
}
}
?>
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.
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)
?>
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)
?>
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());
?>
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.
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.
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.
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.
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.
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.
Beim Exportieren von
Reflection-Objekten in Zeichenketten
werden nun int
und bool
anstelle von
integer
bzw. boolean
verwendet.
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.
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.
Seit PHP 7.3.23 werden die Namen eingehender Cookies aus Sicherheitsgründen nicht mehr URL-dekodiert.