Nicht abwärtskompatible Änderungen
PHP-Kern
Zugriff auf Nicht-Arrays im Array-Stil
Der Versuch, Werte vom Typ null, bool,
int, float oder resource wie ein
Array zu verwenden, (z. B. $null["key"]
) erzeugt nun
einen Hinweis.
Das Schlüsselwort fn
fn
ist nun ein reserviertes Schlüsselwort. Insbesondere
kann es nicht mehr als Funktions- oder Klassenname verwendet werden.
Es kann weiterhin als Name einer Methode oder Klassenkonstante verwendet
werden.
<?php
-Tag am Ende der Datei
Das Tag <?php
am Ende der Datei (ohne nachgestellten
Zeilenumbruch) wird nun als ein öffnendes PHP-Tag interpretiert. Zuvor
wurde es entweder als kurzes öffnendes Tag gefolgt vom Literal
php
interpretiert und führte zu einem Syntaxfehler (bei
short_open_tag=1
) oder es wurde als literale
Zeichenkette <?php
interpretiert (bei
short_open_tag=0
).
Serialisierung
Das Serialisierungsformat o
wurde entfernt. Da es von
PHP nie erzeugt wurde, kann dies nur die Deserialisierung von manuell
erstellten Zeichenketten beeinträchtigen.
Konstanten für den Passwort-Algorithmus
Die Bezeichner der Algorithmen für das Hashing von Passwörtern sind nun
keine Ganzzahlen mehr, sondern nullbare Zeichenketten.
Anwendungen, die die Konstanten PASSWORD_DEFAULT, PASSWORD_BCRYPT,
PASSWORD_ARGON2I und PASSWORD_ARGON2ID korrekt verwenden, werden weiterhin
korrekt funktionieren.
htmlentities() erzeugt nun einen Hinweis (anstelle
einer Warnung wegen strikter Standards), wenn sie mit einer Kodierung
verwendet wird, bei der nur die Substitution von Basisentitäten
unterstützt wird. In diesem Fall entspricht das der Funktion
htmlspecialchars().
fread() und fwrite() geben nun
false
zurück, wenn die Operation fehlgeschlagen ist; zuvor wurde eine
leere Zeichenkette oder 0 zurückgegeben. EAGAIN/EWOULDBLOCK werden nicht
als Fehler gewertet.
Diese Funktionen geben nun auch bei Fehlern eine Meldung aus, z. B. wenn
versucht wird, in eine schreibgeschützte Dateiressource zu schreiben.
BCMath mathematische Berechnungen mit beliebiger Genauigkeit
BCMath-Funktionen erzeugen nun eine Warnung, wenn eine nicht wohlgeformte
Zahl übergeben wird, z. B. "32foo"
. Der Parameter wird
wie bisher als Null interpretiert.
CURL
Der Versuch, eine CURLFile-Klasse zu serialisieren,
erzeugt nun eine Exception. Zuvor wurde die Exception nur bei der
Deserialisierung ausgelöst.
Die Verwendung von CURLPIPE_HTTP1
ist veraltet und
wird ab cURL 7.62.0 nicht mehr unterstützt.
Bei der Funktion curl_version() ist der Parameter
$version
veraltet. Wenn ein anderer Wert als der
Standardwert CURLVERSION_NOW
übergeben wird, wird eine
Warnung ausgegeben und der Parameter wird ignoriert.
Datum und Uhrzeit
Der Aufruf von var_dump() oder ähnlichem mit einer
Instanz von DateTime oder
DateTimeImmutable hinterlässt keine verfügbaren
Eigenschaften des Objekts mehr.
Der Vergleich von DateInterval-Objekten (mittels
==
, <
usw.) erzeugt nun eine
Warnung und gibt immer false
zurück. Zuvor wurden alle
DateInterval-Objekte als gleich angesehen, sofern
sie keine Eigenschaften hatten.
MySQLi
Die integrierte Serverfunktionalität wurde entfernt. Sie war seit
mindestens PHP 7.0 fehlerhaft.
Die undokumentierte Eigenschaft mysqli::$stat
wurde
zugunsten von mysqli::stat() entfernt.
OpenSSL
Die Funktion openssl_random_pseudo_bytes() löst nun
ähnlich wie random_bytes() bei Fehlern eine Exception
aus. Insbesondere wird ein Error ausgelöst, wenn die
Anzahl der angeforderten Bytes kleiner oder gleich Null ist, und eine
Exception wird ausgelöst, wenn nicht genügend
Zufallsdaten gesammelt werden können. Wenn die Funktion keine Exception
wirft, ist der Ausgabeparameter $crypto_strong
garantiert immer true
, weshalb eine explizite Überprüfung nicht nötig ist.
Reguläre Ausdrücke (Perl-kompatibel)
Wenn der Modus PREG_UNMATCHED_AS_NULL
verwendet wird,
werden nicht gefundene Teilsuchmuster nun auch auf null
gesetzt (oder
[null, -1]
, wenn die Erfassung des Offsets aktiviert
ist). Das bedeutet, dass die Größe der $matches
(Übereinstimmungen) immer gleich ist.
PHP-Datenobjekte (PDO)
Der Versuch, eine Instanz von PDO oder
PDOStatement zu serialisieren, erzeugt nun eine
Exception anstelle einer
PDOException, was dem Verhalten anderer interner
Klassen entspricht, die keine Serialisierung unterstützen.
Reflection
Reflection-Objekte erzeugen nun eine Exception, wenn versucht wird, sie zu
serialisieren. Die Serialisierung von Reflection-Objekten wurde nie
unterstützt und führte zu beschädigten Reflection-Objekten. Sie ist nun
ausdrücklich verboten.
Die Werte der Klassenkonstanten von
ReflectionClassConstant,
ReflectionMethod und
ReflectionProperty haben sich geändert.
Standard-PHP-Bibliothek (SPL)
Wenn die Funktion get_object_vars() für eine Instanz von
ArrayObject aufgerufen wird, gibt sie nun immer die
Eigenschaften der Klasse ArrayObject selbst (oder
einer Unterklasse) zurück. Zuvor wurden die Werte des betreffenden
Arrays/Objekts zurückgegeben, es sei denn, das Flag
ArrayObject::STD_PROP_LIST
wurde angegeben.
Andere betroffene Operationen sind:
-
Die Methode ReflectionObject::getProperties()
-
Die Funktionen reset(), current()
usw. Stattdessen sollten die Methoden von
Iterator verwendet werden.
-
Möglicherweise andere, die Objekteigenschaften als Liste bearbeiten, z. B.
die Funktion array_walk().
Typumwandlungen mit (array)
sind davon nicht betroffen.
Sie geben weiterhin entweder das betreffende Array oder die Eigenschaften
der Klasse ArrayObject zurück, je nachdem ob das
Flag ArrayObject::STD_PROP_LIST
verwendet wird.
Die Methode SplPriorityQueue::setExtractFlags() löst
eine Exception aus, wenn Null (0
) übergeben wird. Zuvor
erzeugte dies bei der nächsten Extraktionsoperation einen behebbaren
schwerwiegenden Fehler.
Die Klassen ArrayObject,
ArrayIterator,
SplDoublyLinkedList und
SplObjectStorage unterstützen nun zusätzlich zur
Schnittstelle Serializable das Verfahren
__serialize()
und __unserialize()
.
Das bedeutet, dass die mit älteren PHP-Versionen serialisierten Daten immer
noch deserialisiert werden können, aber Daten, die mit PHP 7.4 erstellt
wurden, von älteren Versionen nicht verstanden werden.
Tokenizer
Die Funktion token_get_all() gibt für unerwartete
Zeichen nun ein T_BAD_CHARACTER
-Token aus, anstatt
Löcher im Token-Stream zu hinterlassen.
Eingehende Cookies
Seit PHP 7.4.11 werden die Namen der eingehenden
Cookies aus Sicherheitsgründen nicht mehr URL-dekodiert.