## Nuevas características

### Tipos 'nullable'

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

### Funciones 'void'

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 sentencia '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.

### Desestructuración de arrays simétricos

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
}`

### Visibilidad de las constantes de clase

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;
}`

### El seudotipo iterable

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) {
//
}
}`

### Manejo de multicaptura de excepciones

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
}`

### Soporte para claves en list()

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
}`

### Soporte para índices negativos de cadenas

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

### Soporte para AEAD en ext/openssl

Se ha añadido soporte para AEAD (modos GCM y CCM) ampliando las funciones openssl_encrypt() y openssl_decrypt() con parámetros adicionales.

### Conversión de 'callables' Closure con Closure::fromCallable()

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"

### Manejo de señales asíncronas

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

### Soporte para 'push' del servidor HTTP/2 en ext/curl

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.