## Nuevas características

### Tipo nullable

La declaración de los tipos de parámetro y de valor de retorno puede ahora ser marcada como nullable prefijando el nombre del tipo con un signo de interrogación. Esto significa que el tipo especificado así como `null` pueden ser pasados como argumento, o devueltos como valor, respectivamente.

    <?php

    function testReturnA(): ?string
    {
        return 'elePHPant';
    }

    var_dump(testReturnA());

    function testReturnB(): ?string
    {
        return null;
    }

    var_dump(testReturnB());

    function test(?string $name)
    {
        var_dump($name);
    }

    test('elePHPant');
    test(null);
    test();

El ejemplo anterior mostrará:

    string(9) "elePHPant"
    NULL
    string(9) "elePHPant"
    NULL
    Fatal error: Uncaught ArgumentCountError: Too few arguments to function test(), 0 passed in...

### Funciones Void

Se ha introducido el tipo de retorno void. Las funciones declaradas con un tipo de retorno void deben omitir la declaración de retorno completamente, o utilizar una declaración de retorno vacía. `null` no es un tipo de retorno válido para una función void.

    <?php
    function swap(&$left, &$right): void
    {
        if ($left === $right) {
            return;
        }

        $tmp = $left;
        $left = $right;
        $right = $tmp;
    }

    $a = 1;
    $b = 2;
    var_dump(swap($a, $b), $a, $b);

El ejemplo anterior mostrará:

    null
    int(2)
    int(1)

Intentar utilizar el valor de retorno de una función void simplemente evalúa a `null`, sin advertencia emitida. La razón para esto es que una advertencia implicaría el uso de una función genérica de orden superior.

### Descomposición simétrica de array

La abreviatura de la sintaxis array `[]` puede ahora ser utilizada para descomponer arrayx para asignaciones (incluyendo dentro de `foreach`), en lugar de la sintaxis existente list(), que sigue siendo soportada.

    <?php
    $data = [
        [1, 'Tom'],
        [2, 'Fred'],
    ];

    // list() style
    list($id1, $name1) = $data[0];

    // [] style
    [$id1, $name1] = $data[0];

    // list() style
    foreach ($data as list($id, $name)) {
        // lógica aquí con $id y $name
    }

    // [] style
    foreach ($data as [$id, $name]) {
        // lógica aquí con $id y $name
    }

### Visibilidad de las constantes de clase

Se ha añadido soporte para especificar la visibilidad de las 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 pseudo-tipo iterable

Se ha introducido un nuevo pseudo-tipo (similar a callable) llamado iterable. Puede ser utilizado con los parámetros y retornos tipados, donde acepta array o objetos que implementan la interfaz Traversable. En cuanto a la subtipificación, los tipos de parámetros de las clases hijas pueden ampliar una declaración de un padre de array o Traversable en iterable. Con los tipos de retorno, las clases hijas pueden restringir el tipo de retorno iterable del padre en array o un objeto que implemente Traversable.

    <?php
    function iterator(iterable $iter)
    {
        foreach ($iter as $val) {
            //
        }
    }

### Gestión del catch de múltiples excepciones

Ahora pueden especificarse múltiples excepciones por bloque catch utilizando el carácter barra vertical (`|`). Esto es útil cuando diferentes excepciones se manejan de la misma manera.

    <?php
    try {
        // código
    } catch (FirstException | SecondException $e) {
        // maneja las excepciones first y second
    }

### Soporte de claves en list()

Ahora es posible especificar claves en list(), o su nueva sintaxis abreviada `[]`. Esto permite la descomposición de arrays que tienen claves no enteras o no secuenciales.

    <?php
    $data = [
        ["id" => 1, "name" => 'Tom'],
        ["id" => 2, "name" => 'Fred'],
    ];

    // list() style
    list("id" => $id1, "name" => $name1) = $data[0];

    // [] style
    ["id" => $id1, "name" => $name1] = $data[0];

    // list() style
    foreach ($data as list("id" => $id, "name" => $name)) {
        // lógica aquí con $id y $name
    }

    // [] style
    foreach ($data as ["id" => $id, "name" => $name]) {
        // lógica aquí con $id y $name
    }

### Soporte para las posiciones negativas de string

Se ha añadido soporte para las posiciones negativas de string a las funciones de manipulación de string que aceptan una posición, así como a la indexación de string con `[]` o `{}`. En tales casos, una posición negativa se interpreta como una posición partiendo del final de la string.

    <?php
    var_dump("abcdef"[-2]);
    var_dump(strpos("aabbcc", "b", -3));

El ejemplo anterior mostrará:

    string (1) "e"
    int(3)

Las posiciones negativas de string y arrayx también son soportadas con la sintaxis simple de análisis en string.

    <?php
    $string = 'bar';
    echo "El último carácter de '$string' es '$string[-1]'.\n";
    ?>

El ejemplo anterior mostrará:

    El último carácter de 'bar' es '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.

### Convertir callables en Closures con Closure::fromCallable()

Se ha introducido un nuevo método estático en la clase Closure para permitir que los callables sean fácilmente convertidos en 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 ejemplo anterior mostrará:

    string(10) "some value"

### Gestión de señales asíncronas

Se ha introducido una nueva función llamada pcntl_async_signals() para permitir la gestión de señales asíncronas sin utilizar los ticks (lo que introducía mucho sobrecosto).

    <?php
    pcntl_async_signals(true); // activar las señales asíncronas

    pcntl_signal(SIGHUP,  function($sig) {
        echo "SIGHUP\n";
    });

    posix_kill(posix_getpid(), SIGHUP);

El ejemplo anterior mostrará:

    SIGHUP

### Soporte de push del servidor HTTP/2 en ext/curl

Se ha añadido soporte para los push del servidor a la extensión CURL (requiere la versión 7.46 o posterior). Esto puede ser explotado 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 para que la ejecución de la función de retrollamada del push del servidor pueda ser aprobada o rechazada.

### Opciones del contexto de flujo (Stream Context Options)

Se ha añadido la opción del contexto de flujo tcp_nodelay.

`↑` and `↓` to navigate • `Enter` to select • `Esc` to close • `/` to open