Las declaraciones de tipos para parámetros y valores de retorno ahora se pueden marcar como
«nullable» prefijando el nombre del tipo con un signo de cierre de interrogación. Esto significa
que, así como el tipo especificado, se puede pasar NULL
como un argumento, o
ser devuelto como un valor, respectivamente.
<?php
function testReturn(): ?string
{
return 'elePHPant';
}
var_dump(testReturn());
function testReturn(): ?string
{
return null;
}
var_dump(testReturn());
function test(?string $name)
{
var_dump($name);
}
test('elePHPant');
test(null);
test();
El resultado del ejemplo sería:
string(10) "elePHPant" NULL string(10) "elePHPant" NULL Uncaught Error: Too few arguments to function test(), 0 passed in...
Se ha introducido un tipo de retorno, void. Las funciones declaradas con
'void' como su tipo de retorno deben o bien omitir su sentencia 'return' totalmente,
o utilizar una senetencia 'return' vacía. NULL
no es un valor de retorno válido para una
función 'void'.
<?php
function intercambiar(&$izquierdo, &$derecho) : void
{
if ($izquierdo === $derecho) {
return;
}
$tmp = $izquierdo;
$izquierdo = $derecho;
$derecho = $tmp;
}
$a = 1;
$b = 2;
var_dump(intercambiar($a, $b), $a, $b);
El resultado del ejemplo sería:
null int(2) int(1)
El uso del valor de retorno de una función 'void' simplemente se evalúa a
NULL
, sin emitir advertencias. Las razón de esto es porque las advertencias
implicarían el uso de funciones genéricas de orden mayor.
La sintaxis abreviada de array ([]) se puede usar ahora para desestructurar arrays para asignaciones (incluyendo dentro de foreach) como alternativa a la sintaxis list() existente, la cual aún se admite.
<?php
$datos = [
[1, 'Tom'],
[2, 'Fred'],
];
// Estilo de list()
list($id1, $nombre1) = $datos[0];
// Estilo de []
[$id1, $list] = $datos[0];
// Estilo de list()
foreach ($datos as list($id, $nombre)) {
// aquí va la lógica con $id y $nombre
}
// Estilo de []
foreach ($datos as [$id, $nombre]) {
// aquí va la lógica con $id y $nombre
}
Se ha añadido soporte para especificar la visibilidad de constantes de clase.
<?php
class ConstDemo
{
const PUBLIC_CONST_A = 1;
public const PUBLIC_CONST_B = 2;
protected const PROTECTED_CONST = 3;
private const PRIVATE_CONST = 4;
}
Se ha introducido un nuevo seudotipo (similar a callable) llamado iterable. Se puede utilizar en parámetros y tipos de retorno, donde acepta tanto arrays u objetos que implementen la interfaz Traversable. Con respecto a la subtipificación, los tipos de parámetros de clases hijas podrían ampliar una declaración de la madre de array o Traversable a iterable. Con los tipos de retorno, las clases hijas podrían reducir un tipo de retorno de la madre de iterable a array o un objeto que implemente Traversable.
<?php
function iterator(iterable $iter)
{
foreach ($iter as $val) {
//
}
}
Ahora se pueden especificar múltiples excepciones por bloque catch con el carácter tubería (|). Esto es útil para cuando diferentes excepciones de diferentes jerarquías de clases son manejadas como la misma.
<?php
try {
// algo de código
} catch (FirstException | SecondException $e) {
// manejar la primera y segunda excepción
}
Ahora se pueden especificar claves en list(), o en su nueva sintaxis abreviada []. Esto habilita la desestructuración de arrays con claves no enteras o no secuenciales.
<?php
$datos = [
["id" => 1, "nombre" => 'Tom'],
["id" => 2, "nombre" => 'Fred'],
];
// Estilo de list()
list("id" => $id1, "nombre" => $nombre1) = $datos[0];
// Estilo de []
["id" => $id1, "nombre" => $nombre1] = $datos[0];
// Estilo de list()
foreach ($datos as list("id" => $id, "nombre" => $nombre)) {
// aquí va la lógica con $id y $nombre
}
// Estilo de []
foreach ($datos as ["id" => $id, "nombre" => $nombre]) {
// aquí va la lógica con $id y $nombre
}
Se ha añadido soporte para índices negativos de cadenas a las funciones de manipulación de cadenas que acepten índices, así como a la indexación de cadenas con [] o {}. En tales casos, un índice negativo se interpreta como un índice desde el final de la cadena.
<?php
var_dump("abcdef"[-2]);
var_dump(strpos("aabbcc", "b", -3));
El resultado del ejemplo sería:
string (1) "e" int(3)
Los índices negativos de cadenas y arrays ahora tambíen se admiten en la sintaxis del paso de una variable dentro de cadenas.
<?php
$string = 'bar';
echo "The last character of '$string' is '$string[-1]'.\n";
?>
El resultado del ejemplo sería:
The last character of 'bar' is 'r'.
Se ha añadido soporte para AEAD (modos GCM y CCM) ampliando las funciones openssl_encrypt() y openssl_decrypt() con parámetros adicionales.
Se ha introducido un nuevo método estático a la clase Closure para poder convertir de forma sencilla callables a objetos Closure.
<?php
class Test
{
public function exposeFunction()
{
return Closure::fromCallable([$this, 'privateFunction']);
}
private function privateFunction($param)
{
var_dump($param);
}
}
$privFunc = (new Test)->exposeFunction();
$privFunc('some value');
El resultado del ejemplo sería:
string(10) "some value"
Se ha introducido una nueva función llamada pcntl_async_signals() para habilitar el manejo de señales asíncronas sin el empleo de «ticks» (lo cual introduce mucha sobrecarga).
<?php
pcntl_async_signals(true); // turn on async signals
pcntl_signal(SIGHUP, function($sig) {
echo "SIGHUP\n";
});
posix_kill(posix_getpid(), SIGHUP);
El resultado del ejemplo sería:
SIGHUP
Se ha añadido soporte para 'push' del servidor a la extensión CURL (requiere
la versión 7.46 y superior). Esto se puede aprovechar a través de la
función curl_multi_setopt() con la nueva
constante CURLMOPT_PUSHFUNCTION
. Las constantes
CURL_PUSH_OK
y CURL_PUSH_DENY
también han sido
añadidas, por lo que la ejecución de la retrollamada 'push' del servidor pueda ser
aprobada o denegada.