This version brings an important changes with the directive zend.exception_ignore_args set to On by default.
In all stack traces, the args key is now missing.
All php frameworks have to handle this to report errors & exceptions.
Für die Funktion array_key_exists() wurde ein
spezieller VM-Opcode hinzugefügt, der die Leistung dieser Funktion
verbessert, wenn der Parameterwert statisch aufgelöst werden kann. In
Code, der Namensräume verwendet, kann es notwendig sein, einen absoluten
Namen zu verwenden (\array_key_exists()
) oder die
Funktion explizit zu importieren.
Wenn die Funktion preg_match() im UTF-8 Modus
(Modifikator "u"
) mehrmals für dieselbe Zeichenkette
aufgerufen wird (aber möglicherweise mit unterschiedlichen Offsets), wird
sie nur einmal auf valides UTF-8 geprüft.
zend.exception_ignore_args ist eine neue INI-Direktive, um Parameter in die von Ausnahmen erzeugten Stacktraces einzubeziehen oder davon auszuschließen.
opcache.preload_user ist eine neue INI-Direktive, um das Benutzerkonto anzugeben, unter dem der vorab geladene Code ausgeführt wird, wenn er sonst unter root laufen würde (was aus Sicherheitsgründen nicht erlaubt ist).
Eine Reihe von Erweiterungen wurde dahingehend umgestellt, dass sie
für die Erkennung von Bibliotheksabhängigkeiten ausschließlich pkg-config
verwenden. Im Allgemeinen bedeutet dies, dass statt
--with-foo-dir=DIR oder ähnlich nur
--with-foo verwendet wird.
Benutzerdefinierte Bibliothekspfade können entweder angegeben werden, imdem
zusätzliche Verzeichnisse zu PKG_CONFIG_PATH
hinzugefügt
werden, oder durch Angabe expliziter Kompilierungsoptionen mittels
FOO_CFLAGS
und FOO_LIBS
.
Die folgenden Erweiterungen und SAPIs sind betroffen:
fputcsv(), fgetcsv(),
SplFileObject::fputcsv(),
SplFileObject::fgetcsv() und
SplFileObject::setCsvControl() akzeptieren nun
eine leere Zeichenkette als $escape
-Parameter, wodurch
der proprietäre PHP-Mechanismus für die Maskierung deaktiviert wird.
Das Verhalten der Funktion str_getcsv() wurde entsprechend angepasst (bisher war eine leere Zeichenkette gleichbedeutend mit der Verwendung der Standardeinstellung).
Die Methode SplFileObject::getCsvControl() kann dementsprechend für das dritte Array-Element nun auch eine leere Zeichenkette zurückgeben.
Für die Erweiterung filter steht die Option --with-pcre-dir für Unix-Builds nicht mehr zur Verfügung; sie kann nun problemlos mit ./configure als Shared gebaut werden.
Das Verhalten der Funktion imagecropauto() in der mitgelieferten libgd-Bibliothek wurde mit dem der libgd des Systems synchronisiert:
IMG_CROP_DEFAULT
greift nicht mehr auf
IMG_CROP_SIDES
zurück.
Bei der Funktion imagecropauto() wurde der
Standardparameter von $mode
geändert auf
IMG_CROP_DEFAULT
; die Übergabe von
-1
ist veraltet.
Die Funktion imagescale() unterstützt nun die
Beibehaltung des Seitenverhältnisses, wenn auf eine feste Höhe skaliert
wird, indem -1
als $new_width
übergeben wird.
Die Erweiterung hash kann nicht mehr deaktiviert werden und ist, ähnlich wie die Erweiterung date, immer ein integraler Bestandteil eines jeden PHP-Builds.
Die Erweiterung intl benötigt nun mindestens ICU 50.1.
Die Klasse ResourceBundle implementiert nun Countable.
Die Unterstützung für nsldap und umich_ldap wurde entfernt.
Alle libxml-basierten Erweiterungen benötigen nun mindestens libxml 2.7.6.
Die Bibliothek oniguruma wird nicht mehr in PHP mitgeliefert, stattdessen muss libonig auf dem System verfügbar sein. Alternativ dazu kann die Option --disable-mbregex verwendet werden, um die Komponente mbregex zu deaktivieren.
Die Konfigurationsoptionen --disable-opcache-file und --enable-opcache-file wurden zugunsten der INI-Direktive opcache.file_cache entfernt.
Die Funktionen password_hash() und
password_needs_rehash() akzeptieren beim Parameter
$algo
nun nullbare String und Integer.
Die Installation von PEAR (einschließlich PECL) ist nicht mehr standardmäßig aktiviert. Sie kann explizit mit der Option --with-pear aktiviert werden. Diese Option ist veraltet und wird möglicherweise in Zukunft entfernt.
Bei den Klassen
ReflectionClass,
ReflectionFunction,
ReflectionMethod,
ReflectionObject und
ReflectionProperty
haben sich die numerischen Werte der Modifizierungskonstanten
(IS_ABSTRACT
,
IS_DEPRECATED
,
IS_EXPLICIT_ABSTRACT
,
IS_FINAL
,
IS_IMPLICIT_ABSTRACT
,
IS_PRIVATE
,
IS_PROTECTED
,
IS_PUBLIC
und
IS_STATIC
) geändert.
Die Klasse SimpleXMLElement implementiert nun Countable.
Die mitgelieferte Bibliothek libsqlite wurde entfernt. Um die Erweiterung SQLite3 zu erstellen, wird nun libsqlite3 ≥ 3.7.4 benötigt. Um die Erweiterung PDO_SQLite zu erstellen, wird nun libsqlite3 ≥ 3.5.0 benötigt.
Es ist nun ausdrücklich verboten, SQLite3, SQLite3Stmt und SQLite3Result zu serialisieren und zu deserialisieren. Zuvor war es zwar möglich, die Instanzen dieser Klassen zu serialisieren, aber die Deserialisierung führte zu unbrauchbaren Objekten.
Die Notation @param
kann nun auch verwendet werden, um
SQL-Abfrageparameter anzugeben.
Die mitgelieferte Bibliothek libzip wurde entfernt. Um die Erweiterung zip zu erstellen, wird nun libzip >= 0.11 benötigt.
This version brings an important changes with the directive zend.exception_ignore_args set to On by default.
In all stack traces, the args key is now missing.
All php frameworks have to handle this to report errors & exceptions.
Note for internals/extensions:
Many opcode values changed between PHP 7.3 and 7.4, so most documentation resources are outdated in that regard. You can look the definitions at Zend/zend_vm_opcodes.h in php-src. For example, ZEND_ECHO changes from 40 to 136.
While opcode changes happen in a lot of PHP versions, the change in 7.4 is quite significant.
As of PHP 7.4, an exception thrown within the user-defined shutdown function can be caught by the user-defined exception handler.
<?php
set_error_handler(
function($level, $error, $file, $line){
if(0 === error_reporting()){
return false;
}
throw new ErrorException($error, -1, $level, $file, $line);
},
E_ALL
);
register_shutdown_function(function(){
$error = error_get_last();
if($error){
throw new ErrorException($error['message'], -1, $error['type'], $error['file'], $error['line']);
}
});
set_exception_handler(function($exception){
// ... more code ...
});
require 'NotExists.php';