Nicht abwärtskompatible Änderungen
PHP Core
Zugriffsbeschränkungen für $GLOBALS
Der Zugriff auf das Array $GLOBALS unterliegt nun einer
einer Reihe von Einschränkungen. Der Lese- und Schreibzugriff auf einzelne
Array-Elemente wie $GLOBALS['var']
funktioniert weiterhin wie
bisher. Der nur lesende Zugriff auf das Gesamt-Array
$GLOBALS wird ebenfalls wird weiterhin unterstützt.
Allerdings wird der Schreibzugriff auf das Gesamt-Array
$GLOBALS nicht mehr unterstützt. Zum Beispiel wird
array_pop($GLOBALS)
zu einem Fehler führen.
Verwendung von static-Variablen in geerbten Methoden
Wenn eine Methode, die statische Variablen verwendet, geerbt (aber nicht überschrieben) wird, teilt die geerbte Methode nun die statischen Variablen mit der Methode der Elternklasse.
<?php
class A {
public static function counter() {
static $counter = 0;
$counter++;
return $counter;
}
}
class B extends A {}
var_dump(A::counter()); // int(1)
var_dump(A::counter()); // int(2)
var_dump(B::counter()); // int(3), vorher int(1)
var_dump(B::counter()); // int(4), vorher int(2)
?>
Angabe optionaler Parameter vor den erforderlichen
Ein optionaler Parameter, der vor den erforderlichen Parametern angegeben wird, wird nun immer als erforderlich angesehen. Dies ist auch der Fall, wenn eine Funktion mit benannten Parametern aufgerufen wird. Seit PHP 8.0.0, aber vor PHP 8.1.0, löst das untenstehende Beispiel einen Hinweis darauf aus, dass die Definition veraltet ist, läuft aber beim Aufruf trotzdem fehlerfrei. Ab PHP 8.1.0 wird ein Fehler der Klasse ArgumentCountError ausgelöst, so wie es auch bei einem Aufruf mit positionsbezogenen Parametern der Fall wäre.
<?php
function makeyogurt($container = "bowl", $flavour)
{
return "Making a $container of $flavour yogurt.\n";
}
try
{
echo makeyogurt(flavour: "raspberry");
}
catch (Error $e)
{
echo get_class($e), ' - ', $e->getMessage(), "\n";
}
?>
Das oben gezeigte Beispiel erzeugt mit PHP 8.0 folgende Ausgabe:
Deprecated: Required parameter $flavour follows optional parameter $container in example.php on line 3 Making a bowl of raspberry yogurt.
Das oben gezeigte Beispiel erzeugt mit PHP 8.1 folgende Ausgabe:
Deprecated: Optional parameter $container declared before required parameter $flavour is implicitly treated as a required parameter in example.php on line 3 ArgumentCountError - makeyogurt(): Argument #1 ($container) not passed
Es ist zu beachten, dass ein Standardwert von null
vor erforderlichen
Parametern verwendet werden kann, um einen
nullbaren Typ
anzugeben, aber der Parameter wird trotzdem benötigt.
Kompatibilität des Rückgabetyps mit internen Klassen
Die meisten nicht-finalen internen Methoden erfordern nun, dass
überschreibende Methoden einen kompatiblen Rückgabetyp deklarieren,
andernfalls wird bei der Vererbungsüberprüfung ein Hinweis darauf
ausgegeben, dass die Funktionsweise veraltet ist. Falls der Rückgabetyp
aufgrund von Kompatibilitätsproblemen zwischen PHP-Versionen für eine
überschreibende Methode nicht deklariert werden kann, kann das Attribut
#[ReturnTypeWillChange]
hinzugefügt werden, um den Hinweis
auf die veraltete Variante zu unterdrücken.
Neue Schlüsselwörter
readonly
ist nun ein Schlüsselwort. Es kann jedoch
weiterhin als Name einer Funktion verwendet werden.
never
ist nun ein reserviertes Wort, sodass es nicht verwendet werden kann,
um eine Klasse, eine Schnittstelle oder einen Trait zu benennen,
und es darf auch nicht in Namespaces verwendet werden.
Umstellung von Ressourcen auf Objekte
Mehrere Ressourcen wurden zu Objekten migriert.
Rückgabewertprüfungen mit is_resource() sollten durch
Prüfungen auf false
ersetzt werden.
-
Die FileInfo-Funktionen akzeptieren nun finfo-Objekte anstelle von
fileinfo
-Ressourcen und geben diese auch zurück. -
Die FTP-Funktionen akzeptieren nun FTP\Connection-Objekte anstelle von
ftp
-Ressourcen und geben diese auch zurück. -
Die IMAP-Funktionen akzeptieren nun IMAP\Connection-Objekte anstelle von
imap
-Ressourcen und geben diese auch zurück. -
Die LDAP-Funktionen akzeptieren nun LDAP\Connection-Objekte anstelle von
ldap link
-Ressourcen und geben diese auch zurück. -
Die LDAP-Funktionen akzeptieren nun LDAP\Result-Objekte anstelle von
ldap result
-Ressourcen und geben diese auch zurück. -
Die LDAP-Funktionen akzeptieren nun LDAP\ResultEntry-Objekte anstelle von
ldap result entry
-Ressourcen und geben diese auch zurück. -
Die PgSQL-Funktionen akzeptieren nun PgSql\Connection-Objekte anstelle von
pgsql link
-Ressourcen und geben diese auch zurück. -
Die PgSQL-Funktionen akzeptieren nun PgSql\Result-Objekte anstelle von
pgsql result
-Ressourcen und geben diese auch zurück. -
Die PgSQL-Funktionen akzeptieren nun PgSql\Lob-Objekte anstelle von
pgsql large object
-Ressourcen und geben diese auch zurück. -
Die PSpell-Funktionen akzeptieren nun PSpell\Dictionary-Objekte anstelle von
pspell
-Ressourcen und geben diese auch zurück. -
Die PSpell-Funktionen akzeptieren nun PSpell\Config-Objekte anstelle von
pspell config
-Ressourcen und geben diese auch zurück.
MySQLi
mysqli_fetch_fields() und
mysqli_fetch_field_direct() geben nun bei der
Eigenschaft max_length immer 0
zurück. Dieser Wert kann berechnet werden, indem die Ergebnismenge in einer
Schleife durchlaufen und die maximale Länge ermittlt wird. Dies ist der
Algorithmus, den PHP zuvor intern verwendet hat.
Die Option MYSQLI_STMT_ATTR_UPDATE_MAX_LENGTH
hat
keine Auswirkung mehr.
Die Option MYSQLI_STORE_RESULT_COPY_DATA
hat keine
Auswirkung mehr. Die Übergabe eines beliebigen Wertes an den
mode
-Parameter von
mysqli::store_result() hat keine Auswirkung mehr.
mysqli::connect() gibt bei Erfolg nun true
anstelle von null
zurück.
Der Standard-Fehlerbehandlungsmodus wurde von "silent" auf "exceptions"
geändert. Siehe die Seite
MySQLi-Berichtsmodus für
weitere Details darüber, was das bedeutet, und wie man dieses Attribut
explizit setzt. Um das vorherige Verhalten wiederherzustellen, kann
folgendes verwendet werden: mysqli_report(MYSQLI_REPORT_OFF);
Klassen, die mysqli_stmt::execute() erweitern, müssen nun den zusätzlichen optionalen Parameter angeben.
MySQLnd
Die INI-Direktive mysqlnd.fetch_data_copy wurde entfernt. Dies sollte zu keinen für den Benutzer sichtbaren Verhaltensänderungen führen.
OpenSSL
Private EC-Schlüssel werden jetzt wie alle anderen Schlüssel im PKCS#8-Format statt im traditionellen Format exportiert.
openssl_pkcs7_encrypt() und openssl_cms_encrypt() verwenden nun standardmäßig AES-128-CBC anstelle von RC2-40. Die RC2-40-Chiffre gilt als unsicher und wird von OpenSSL 3 standardmäßig nicht aktiviert.
PHP-Datenobjekte
PDO::ATTR_STRINGIFY_FETCHES
wandelt nun Werte vom Typ
Boolean in "0"
oder "1"
um. Zuvor
wurden Booleans nicht stringifiziert.
Wenn PDO::ATTR_STRINGIFY_FETCHES
nicht aktiviert ist,
Bindet der Aufruf von PDOStatement::bindColumn() mit
PDO::PARAM_LOB
das Ergebnis eines Streams nun
dauerhaft ein. Zuvor war das Ergebnis entweder ein Stream oder eine
Zeichenkette, je nach verwendetem Datenbanktreiber und dem Zeitpunkt der
Bindung.
MySQL-Treiber
Integer- und Float-Werte in Ergebnismengen werden nun als native PHP-Typen
anstelle von Strings zurückgegeben, wenn emulierte vorbereitete
Anweisungen verwendet werden. Dies entspricht dem Verhalten von nativen
vorbereiteten Anweisungen. Das vorherige Verhalten kann wiederhergestellt
werden, indem die Option PDO::ATTR_STRINGIFY_FETCHES
aktiviert wird.
SQLite-Treiber
Integer- und Float-Werte in Ergebnismengen werden nun als native PHP-Typen
zurückgegeben. Das vorherige Verhalten kann wiederhergestellt werden,
indem die Option PDO::ATTR_STRINGIFY_FETCHES
aktiviert wird.
Phar
Um der ArrayAccess-Schnittstelle zu entsprechen, geben Phar::offsetUnset() und PharData::offsetUnset() keinen Boolean-Wert mehr zurück.
Standardfunktionen
version_compare() akzeptiert keine undokumentierten Operator-Abkürzungen mehr.
htmlspecialchars(),
htmlentities(),
htmlspecialchars_decode(),
html_entity_decode()
und get_html_translation_table()
verwenden nun standardmäßig ENT_QUOTES | ENT_SUBSTITUTE
anstelle von ENT_COMPAT
. Das bedeutet, dass
'
zu '
umgewandelt wird,
während vorher nichts geändert wurde. Darüber hinaus werden fehlerhafte
UTF-8-Zeichen durch ein Unicode-Ersatzzeichen ersetzt und nicht mehr durch
eine leere Zeichenkette.
debug_zval_dump() gibt nun nicht nur den eigenen
Referenzzähler aus, sondern auch den Referenzzähler des Referenz-Wrappers,
anstatt dem Wert ein &
voranzustellen. Dies ist ein
genaueres Modell der Referenzdarstellung seit PHP 7.0.
debug_zval_dump() gibt für festgelegte Zeichenketten und
unveränderliche Arrays nun interned
aus.
Standard-PHP-Bibliothek (SPL)
SplFixedArray wird nun wie ein Array in JSON kodiert.