El acceso al array $GLOBALS está ahora sujeto a
un cierto número de restricciones.
El acceso en lectura y en escritura a los elementos individuales del array como
$GLOBALS['var']
continúa funcionando como tal.
El acceso en lectura al array completo $GLOBALS continúa
también siendo soportado.
Sin embargo, el acceso en escritura al array completo $GLOBALS
ya no es soportado. Por ejemplo, array_pop($GLOBALS)
generará un error.
Cuando un método que utiliza variables static es heredado (pero no sobrescrito), el método heredado compartirá ahora las variables.
<?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), anteriormente int(1)
var_dump(B::counter()); // int(4), anteriormente int(2)
?>
Un parámetro opcional especificado antes de los parámetros requeridos es ahora siempre tratado como requerido, incluso cuando se llama utilizando los argumentos nombrados. A partir de PHP 8.0.0, pero antes de PHP 8.1.0, el código a continuación emite una nota de deprecación en la definición, pero se ejecuta con éxito cuando se llama. A partir de PHP 8.1.0, se lanza un error de la clase ArgumentCountError, como sería el caso cuando se llama con argumentos posicionales.
<?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";
}
?>
Salida del ejemplo anterior en PHP 8.0:
Deprecated: Required parameter $flavour follows optional parameter $container in example.php on line 3 Making a bowl of raspberry yogurt.
Salida del ejemplo anterior en PHP 8.1:
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
Tenga en cuenta que un valor por defecto de null
puede ser utilizado antes de los parámetros requeridos para
especificar un tipo nullable,
pero el parámetro será siempre requerido.
La mayoría de los métodos internos no finales requieren ahora que los métodos de sobrecarga declaren un tipo de retorno compatible, de lo contrario se emite una nota de deprecación al validar la herencia. En el caso en que el tipo de retorno no pueda ser declarado para un método de sobrecarga debido a preocupaciones de compatibilidad inter-versión de PHP, un atributo ReturnTypeWillChange puede ser añadido para suprimir la nota de deprecación.
readonly
es ahora una palabra clave. Sin embargo, aún puede ser utilizada
como nombre de función.
never
es ahora una palabra reservada, por lo que no puede ser utilizada para nombrar una clase,
una interfaz o un trait, y también está prohibido su uso en los namespaces.
Varios recursos han sido migrados a objects.
Las verificaciones de valor de retorno utilizando is_resource() deben ser reemplazadas por verificaciones de false
.
Las funciones FileInfo aceptan y devuelven ahora
objetos finfo en lugar
de recursos fileinfo
.
Las funciones FTP aceptan y devuelven ahora
objetos FTP\Connection en lugar
de recursos ftp
.
Las funciones IMAP aceptan y devuelven ahora
objetos IMAP\Connection en lugar
de recursos imap
.
Las funciones LDAP aceptan y devuelven ahora
objetos LDAP\Connection en lugar
de recursos ldap
.
Las funciones LDAP aceptan y devuelven ahora
objetos LDAP\Result en lugar
de recursos ldap result
.
Las funciones LDAP aceptan y devuelven ahora
objetos LDAP\ResultEntry en lugar
de recursos ldap result entry
.
Las funciones PgSQL aceptan y devuelven ahora
objetos PgSql\Connection en lugar
de recursos pgsql link
.
Las funciones PgSQL aceptan y devuelven ahora
objetos PgSql\Result en lugar
de recursos pgsql result
.
Las funciones PgSQL aceptan y devuelven ahora
objetos PgSql\Lob en lugar
de recursos pgsql large object
.
Las funciones PSpell aceptan y devuelven ahora
objetos PSpell\Dictionary en lugar
de recursos pspell
.
Las funciones PSpell aceptan y devuelven ahora
objetos PSpell\Config en lugar
de recursos pspell config
.
mysqli_fetch_fields(), y
mysqli_fetch_field_direct() devolverán ahora
0
para la max_length.
Esta información puede ser calculada iterando sobre el conjunto de resultados,
y tomando la longitud máxima. Esto es lo que PHP hacía
anteriormente de manera interna.
La opción MYSQLI_STMT_ATTR_UPDATE_MAX_LENGTH
ya no tiene ningún efecto.
La opción MYSQLI_STORE_RESULT_COPY_DATA
ya no tiene ningún efecto. Pasar un valor al
parámetro mode
de
mysqli::store_result() ya no tiene ningún efecto.
mysqli::connect() devuelve ahora true
en lugar de null
en caso de éxito.
El modo de manejo de errores por defecto ha sido cambiado de "silencioso" a "excepciones".
Ver la página Modo de reporte MySQLi
para más detalles sobre lo que esto implica,
y cómo definir explícitamente este atributo.
Para restaurar el comportamiento anterior, utilice :
mysqli_report(MYSQLI_REPORT_OFF);
Las clases que extienden mysqli_stmt::execute() deben ahora especificar el parámetro opcional adicional.
La directiva INIT mysqlnd.fetch_data_copy ha sido eliminada. Esto no debería resultar en cambios de comportamiento visibles para el usuario.
Las claves privadas EC serán ahora exportadas en formato PKCS#8 en lugar del formato tradicional, al igual que todas las demás claves.
openssl_pkcs7_encrypt() y openssl_cms_encrypt() utilizarán ahora por defecto AES-128-CBC en lugar de RC2-40. El cifrado RC2-40 es considerado como no seguro y no está habilitado por defecto por OpenSSL 3.
PDO::ATTR_STRINGIFY_FETCHES
transforma ahora los valores
de tipo bool en "0"
o
"1"
. Anteriormente, los bool no eran transformados en cadenas.
Llamar a PDOStatement::bindColumn() con
PDO::PARAM_LOB
enlazará ahora constantemente un stream
de resultado cuando PDO::ATTR_STRINGIFY_FETCHES
no esté activado.
Anteriormente, el resultado era o bien un stream o bien una cadena dependiendo del
controlador de base de datos utilizado y del momento en que se realizaba el enlace.
Los enteros y los flotantes en los conjuntos de resultados serán ahora devueltos utilizando
los tipos nativos PHP en lugar de strings al utilizar las declaraciones preparadas emuladas.
Esto corresponde al comportamiento de las declaraciones preparadas nativas.
El comportamiento anterior puede ser restaurado activando la opción
PDO::ATTR_STRINGIFY_FETCHES
.
Los enteros y los flotantes en los conjuntos de resultados serán ahora devueltos utilizando
los tipos PHP.
El comportamiento anterior puede ser restaurado activando la opción
PDO::ATTR_STRINGIFY_FETCHES
.
Para cumplir con la interfaz ArrayAccess, Phar::offsetUnset() y PharData::offsetUnset() ya no devuelven un bool.
version_compare() ya no acepta las abreviaciones de operadores no documentadas.
htmlspecialchars(),
htmlentities(),
htmlspecialchars_decode(),
html_entity_decode(),
y get_html_translation_table()
utilizan ahora ENT_QUOTES | ENT_SUBSTITUTE
en lugar de
ENT_COMPAT
por defecto.
Esto significa que '
es escapado en
'
mientras que anteriormente no se hacía nada.
Además, el UTF-8 mal formado será reemplazado por un carácter de sustitución Unicode,
en lugar de resultar en una cadena vacía.
debug_zval_dump() muestra ahora el refcount de las referencias
con su refcount, en lugar de simplemente anteponer
&
al valor.
Esto modela más precisamente la representación de referencia desde PHP 7.0.
debug_zval_dump() muestra ahora interned
en lugar de un refcount ficticio para las cadenas internadas y los arrays inmutables.
SplFixedArray, será ahora codificado en JSON como un array.