PHP 8.1.6 Released!

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::$xTest2::$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.

add a note add a note

User Contributed Notes 1 note

up
-5
chris at ocproducts dot com
2 years ago
PCRE has been updated (https://wiki.php.net/rfc/pcre2-migration#backward_incompatible_changes).
The new PCRE version is stricter in some cases.
To Top