Las propiedades de clase ahora admiten declaraciones de tipo.
<?php
class User {
public int $id;
public string $name;
}
?>
$user->id
solo puede
asignarse valores de tipo int y $user->name
solo puede
asignarse valores de tipo string.
Arrow functions proporciona una sintaxis abreviada para definir funciones con ligadura de ámbito implícita por valor.
<?php
$factor = 10;
$nums = array_map(fn($n) => $n * $factor, [1, 2, 3, 4]);
// $nums = array(10, 20, 30, 40);
?>
El siguiente código ahora funcionará:
<?php
class A {}
class B extends A {}
class Producer {
public function method(): A {}
}
class ChildProducer extends Producer {
public function method(): B {}
}
?>
<?php
$array['key'] ??= computeDefault();
// es aproximadamente equivalente a
if (!isset($array['key'])) {
$array['key'] = computeDefault();
}
?>
<?php
$parts = ['apple', 'pear'];
$fruits = ['banana', 'orange', ...$parts, 'watermelon'];
// ['banana', 'orange', 'apple', 'pear', 'watermelon'];
?>
Los literales numéricos pueden contener guiones bajos entre dígitos.
<?php
6.674_083e-11; // float
299_792_458; // decimal
0xCAFE_F00D; // hexadecimal
0b0101_1111; // binario
?>
Las referencias débiles permiten al programador retener una referencia a un objeto que no impide que el objeto sea destruido.
Lanzar excepciones desde __toString() ahora está permitido. Anteriormente esto resultaba en un error fatal. Los errores fatales recuperables existentes en las conversiones de string han sido convertidos a excepciones de tipo Error.
CURLFile ahora admite envolturas de flujo además de nombres de fichero simples, si la extensión ha sido construida contra libcurl >= 7.56.0.
El filtro FILTER_VALIDATE_FLOAT
ahora admite las
opciones min_range
y max_range
,
con la misma semántica que FILTER_VALIDATE_INT
.
FFI es una nueva extensión, que proporciona una forma sencilla de llamar a funciones nativas, acceder a variables nativas y crear/acceder a estructuras de datos definidas en bibliotecas C.
Se ha añadido el filtro de imagen IMG_FILTER_SCATTER
para aplicar un filtro de dispersión a las imágenes.
Se ha añadido el hash crc32c
utilizando el polinomio de Castagnoli.
Esta variante de CRC32 es utilizada por sistemas de almacenamiento, como
iSCSI, SCTP, Btrfs y ext4.
Se ha añadido la función mb_str_split(), que proporciona la misma funcionalidad que str_split(), pero operando sobre puntos de código en lugar de bytes.
Se ha añadido soporte para la precarga de código.
Las funciones preg_replace_callback() y preg_replace_callback_array()
ahora aceptan un argumento adicional flags
, con soporte para las
banderas PREG_OFFSET_CAPTURE
y PREG_UNMATCHED_AS_NULL
.
Esto influye en el formato del array de coincidencias pasado a la función de retrollamada.
El nombre de usuario y la contraseña ahora pueden especificarse como parte del DSN de PDO para los controladores mysql, mssql, sybase, dblib, firebird y oci. Anteriormente esto solo era admitido por el controlador pgsql. Si un nombre de usuario/contraseña se especifica tanto en el constructor como en el DSN, el constructor tiene prioridad.
Ahora es posible escapar los signos de interrogación en las consultas SQL para evitar que se interpreten como marcadores de posición de parámetros. Escribir ??
permite enviar un solo signo de interrogación a la base de datos y, por ejemplo, utilizar el
operador de existencia de clave JSON de PostgreSQL (?
).
PDOStatement::getColumnMeta() ahora está disponible.
PDOStatement::getAttribute(PDO::SQLITE_ATTR_READONLY_STATEMENT)
permite verificar si la sentencia es de solo lectura, es decir, si no modifica
la base de datos.
PDO::setAttribute(PDO::SQLITE_ATTR_EXTENDED_RESULT_CODES, true)
habilita el uso de códigos de resultado extendidos de SQLite3 en PDO::errorInfo()
y PDOStatement::errorInfo().
Se ha añadido SQLite3::lastExtendedErrorCode() para obtener el último código de resultado extendido.
Se ha añadido SQLite3::enableExtendedResultCodes($enable = true)
,
que hará que SQLite3::lastErrorCode()
devuelva códigos de resultado extendidos.
strip_tags() ahora también acepta un array de etiquetas permitidas:
en lugar de strip_tags($str, '<a><p>')
ahora se puede escribir strip_tags($str, ['a', 'p'])
.
Se ha añadido un nuevo mecanismo para la serialización personalizada de objetos, que
utiliza dos nuevos métodos mágicos: __serialize
y __unserialize
.
<?php
// Devuelve un array que contiene todo el estado necesario del objeto.
public function __serialize(): array;
// Restaura el estado del objeto a partir del array de datos dado.
public function __unserialize(array $data): void;
?>
array_merge() y array_merge_recursive()
ahora pueden ser llamadas sin ningún argumento, en cuyo caso devolverán un array vacío.
Esto es útil en combinación con el operador de dispersión, por ejemplo, array_merge(...$arrays)
.
proc_open() ahora acepta un array en lugar de un string para el comando. En este caso, el proceso se abrirá directamente (sin pasar por una shell) y PHP se encargará de cualquier escape necesario de los argumentos.
<?php
proc_open(['php', '-r', 'echo "Hello World\n";'], $descriptors, $pipes);
?>
proc_open() ahora admite
descriptores redirect
y null
.
<?php
// Como 2>&1 en la shell
proc_open($cmd, [1 => ['pipe', 'w'], 2 => ['redirect', 1]], $pipes);
// Como 2>/dev/null o 2>nul en la shell
proc_open($cmd, [1 => ['pipe', 'w'], 2 => ['null']], $pipes);
?>
password_hash() ahora tiene las implementaciones argon2i y argon2id de la extensión sodium cuando PHP se construye sin libargon.