Nuevas características

PHP Core

Typed properties

Las propiedades de clase ahora admiten declaraciones de tipo.

<?php
class User {
public
int $id;
public
string $name;
}
?>
El ejemplo anterior garantiza que $user->id solo puede asignarse valores de tipo int y $user->name solo puede asignarse valores de tipo string.

Arrow functions

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);
?>

Covarianza limitada del tipo de retorno y contravarianza del tipo de argumento

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 {}
}
?>
El soporte completo de varianza solo está disponible si se utiliza la carga automática. Dentro de un solo fichero solo son posibles referencias de tipo no cíclicas, porque todas las clases deben estar disponibles antes de ser referenciadas.

Operador de asignación de fusión nula

<?php
$array
['key'] ??= computeDefault();
// es aproximadamente equivalente a
if (!isset($array['key'])) {
$array['key'] = computeDefault();
}
?>

Desempaquetado dentro de arrays

<?php
$parts
= ['apple', 'pear'];
$fruits = ['banana', 'orange', ...$parts, 'watermelon'];
// ['banana', 'orange', 'apple', 'pear', 'watermelon'];
?>

Separador de literales numéricos

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
?>

Referencias débiles

Las referencias débiles permiten al programador retener una referencia a un objeto que no impide que el objeto sea destruido.

Permitir excepciones desde __toString()

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.

CURL

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.

Filter

El filtro FILTER_VALIDATE_FLOAT ahora admite las opciones min_range y max_range, con la misma semántica que FILTER_VALIDATE_INT.

FFI

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.

GD

Se ha añadido el filtro de imagen IMG_FILTER_SCATTER para aplicar un filtro de dispersión a las imágenes.

Hash

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.

Multibyte String

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.

OPcache

Se ha añadido soporte para la precarga de código.

Regular Expressions (Perl-Compatible)

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.

PDO

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 (?).

PDO_OCI

PDOStatement::getColumnMeta() ahora está disponible.

PDO_SQLite

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().

SQLite3

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.

Standard

strip_tags() con array de nombres de etiquetas

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']).

Serialización personalizada de objetos

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;
?>
El nuevo mecanismo de serialización sustituye a la interfaz Serializable, que será deprecada en el futuro.

Funciones de combinación de arrays sin argumentos

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).

Función proc_open()

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);
?>

argon2i(d) sin libargon

password_hash() ahora tiene las implementaciones argon2i y argon2id de la extensión sodium cuando PHP se construye sin libargon.