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.
Se ha añadido un opcode de VM especializado para la función
array_key_exists(), lo que mejora el rendimiento de esta función si puede resolverse estáticamente.
En el código bajo un espacio de nombres, esto puede requerir escribir
\array_key_exists() o importar explícitamente la función.
Cuando preg_match() en modo UTF-8 (modificador
"u") se llama repetidamente sobre la misma string
(pero posiblemente en diferentes posiciones), solo se verificará una vez para la validez UTF-8.
zend.exception_ignore_args es una nueva directiva INI para incluir o excluir los argumentos de las trazas de pila generadas por las excepciones.
opcache.preload_user es una nueva directiva INI que permite especificar la cuenta de usuario que tiene el rol de ejecutar el código precargado (el usuario root no está permitido por razones de seguridad).
Se ha migrado un número de extensiones para usar exclusivamente pkg-config para la detección de dependencias de bibliotecas. Generalmente, esto significa que en lugar de usar
--with-foo-dir=DIR o similar, solo se usa
--with-foo. Las rutas de bibliotecas personalizadas pueden especificarse agregando directorios adicionales a PKG_CONFIG_PATH o especificando las opciones de compilación explícitamente a través de
FOO_CFLAGS y FOO_LIBS.
Las siguientes extensiones y SAPIs están afectadas:
CURL:
--with-curl ya no acepta un directorio.
Enchant:
--with-enchant ya no acepta un directorio.
FPM:
--with-fpm-systemd ahora usa solo pkg-config para las verificaciones de libsystem. La versión mínima de libsystemd requerida es 209.
GD:
--with-gd se convierte en --enable-gd (para habilitar la extensión) y --with-external-gd (para optar por usar una libgd externa, en lugar de la proporcionada).
--with-png-dir ha sido eliminado. libpng es requerido.
--with-zlib-dir ha sido eliminado. zlib es requerido.
--with-freetype-dir se convierte en --with-freetype
--with-jpeg-dir se convierte en --with-jpeg
--with-webp-dir se convierte en --with-webp
--with-xpm-dir se convierte en --with-xpm
IMAP:
--with-kerberos-systemd ya no acepta un directorio.
Intl:
--with-icu-dir ha sido eliminado. Si se pasa --enable-intl, entonces libicu siempre es requerido.
LDAP:
--with-ldap-sasl ya no acepta un directorio.
Libxml:
--with-libxml-dir ha sido eliminado.
--enable-libxml se convierte en --with-libxml.
--with-libexpat-dir ha sido renombrado a --with-expat y ya no acepta un directorio.
LiteSpeed:
--with-litespeed se convierte en --enable-litespeed.
Mbstring:
--with-onig ha sido eliminado. A menos que se pase --disable-mbregex, libonig es requerido.
ODBC:
--with-iodbc ya no acepta un directorio.
--with-unixODBC sin un directorio ahora usa phg-config (preferible). El directorio aún se acepta para versiones antiguas sin libodbc.pc.
OpenSSL:
--with-openssl ya no acepta un directorio.
PCRE:
--with-pcre-regex ha sido eliminado. En su lugar, --with-external-pcre se ofrece para optar por usar una biblioteca PCRE externa, en lugar de la proporcionada.
PDO_SQLite:
--with-pdo-sqlite ya no acepta un directorio.
Readline:
--with-libedit ya no acepta un directorio.
Sodium:
--with-sodium ya no acepta un directorio.
SQLite3:
--with-sqlite3 ya no acepta un directorio.
XSL:
--with-xsl ya no acepta un directorio.
Zip:
--with-libzip ha sido eliminado.
--enable-zip se convierte en --with-zip.
fputcsv(),
fgetcsv(),
SplFileObject::fputcsv(),
SplFileObject::fgetcsv(), y
SplFileObject::setCsvControl()
ahora aceptan una string vacía como argumento
$escape, lo que desactiva el mecanismo de escape propietario de PHP.
El comportamiento de str_getcsv() se ha ajustado en consecuencia (anteriormente, una string vacía era igual a usar los valores por defecto).
SplFileObject::getCsvControl() ahora también puede devolver una string vacía para el tercer elemento del array.
La extensión filter ya no expone --with-pcre-dir para los builds Unix y ahora puede compilarse de manera confiable como compartida al usar ./configure
El comportamiento de imagecropauto() en la biblioteca libgd proporcionada se ha sincronizado con el de libgd del sistema:
IMG_CROP_DEFAULT ya no se repliega en
IMG_CROP_SIDES
El umbral de recorte (Threshold-cropping) ahora usa el algoritmo de libgd del sistema.
El parámetro por defecto $mode de
imagecropauto() se ha cambiado a
IMG_CROP_DEFAULT; proporcionar -1
ahora está obsoleto.
imagescale() ahora soporta la preservación de la relación de aspecto al escalar a una altura fija pasando -1 a $new_width.
La extensión hash ya no puede ser desactivada y siempre forma parte de cualquier build de PHP, similar a la extensión date.
Se ha eliminado el soporte para nsldap y umich_ldap.
Todas las extensiones basadas en libxml requieren libxml 2.7.6 o superior.
La biblioteca oniguruma ya no se proporciona con PHP; en su lugar, libonig debe estar disponible en el sistema. Alternativamente, --disable-mbregex puede usarse para desactivar el componente mbregex.
Las opciones de configuración --disable-opcache-file y --enable-opcache-file han sido eliminadas en favor de la directiva INI opcache.file_cache.
Las funciones password_hash() y password_needs_rehash()
ahora aceptan string y int nullable para el argumento
$algo.
La instalación de PEAR (incluido PECL) ya no está habilitada por defecto. Esto puede habilitarse explícitamente usando --with-pear. Esta opción está obsoleta y podría eliminarse en el futuro.
Los valores numéricos de las constantes de modificador
(IS_ABSTRACT,
IS_DEPRECATED,
IS_EXPLICIT_ABSTRACT,
IS_FINAL,
IS_IMPLICIT_ABSTRACT,
IS_PRIVATE,
IS_PROTECTED,
IS_PUBLIC, y
IS_STATIC) en las clases
ReflectionClass,
ReflectionFunction,
ReflectionMethod,
ReflectionObject, y
ReflectionProperty
han sido modificados.
SimpleXMLElement ahora implementa Countable.
La biblioteca libsqlite integrada ha sido eliminada. Para compilar la extensión SQLite3 ahora se requiere una libsqlite3 ≥ 3.7.4 del sistema. Para compilar la extensión PDO_SQLite ahora se requiere una libsqlite3 ≥ 3.5.0 del sistema.
La serialización y deserialización de SQLite3, SQLite3Stmt y SQLite3Result ahora está explícitamente prohibida. Anteriormente, la serialización de instancias de estas clases era posible, pero la deserialización generaba objetos inutilizables.
La notación @param ahora puede usarse para denotar los parámetros de consulta SQL.
La biblioteca libzip integrada ha sido eliminada. Ahora se requiere una libzip >= 0.11 del sistema para compilar la extensión zip.
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.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';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.