PHP 8.6.0 Alpha 2 available for testing

Nuevas características

Tipos nullables

La declaración de los tipos de parámetro y de valor de retorno ahora se puede marcar como nullable prefijando el nombre del tipo con un signo de interrogación. Esto significa que tanto el tipo especificado como null se pueden pasar como argumento, o devolver 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.

Desestructuración simétrica de arrays

La abreviatura de la sintaxis array [] ahora se puede utilizar para desestructurar arrays en asignaciones (incluyendo dentro de foreach), en lugar de la sintaxis existente list(), que se sigue admitiendo.

<?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. Se puede utilizar con los parámetros y retornos tipados, donde acepta arrays u 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) {
        //
    }
}

Captura de múltiples excepciones (Multi-catch)

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 desestructuració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 índices de string negativos

Se ha añadido soporte para índices de string negativos a las funciones de manipulación de strings que aceptan una posición, así como a la indexación de strings con [] o {}. En tales casos, un índice negativo se interpreta como un desplazamiento desde el final del string.

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

El ejemplo anterior mostrará:

string (1) "e"
int(3)

Los desplazamientos de string negativos también se admiten con la sintaxis simple de análisis en strings.

<?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 se conviertan fácilmente 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 para HTTP/2 Server Push en ext/curl

Se ha añadido soporte para HTTP/2 Server Push a la extensión cURL (requiere la versión 7.46 o posterior). Esto se puede aprovechar a través de la función curl_multi_setopt() con la nueva constante CURLMOPT_PUSHFUNCTION. También se han añadido las constantes CURL_PUSH_OK y CURL_PUSH_DENY para que se pueda aprobar o rechazar la ejecución de la función de retrollamada de HTTP/2 Server Push.

Opciones del contexto de flujo (Stream Context Options)

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

add a note

User Contributed Notes 2 notes

up
75
DYM
8 years ago
<?php
function swap( &$a, &$b ): void
  { [ $a, $b ] = [ $b, $a ]; }
?>
up
26
unti1x
8 years ago
Note that declaring nullable return type does not mean that you can skip return statement at all. For example:

php > function a(): ?string { }
php > a();
PHP Warning:  Uncaught TypeError: Return value of a() must be of the type string or null, none returned in php shell code:2

php > function b(): ?string { return; }
PHP Fatal error:  A function with return type must return a value (did you mean "return null;" instead of "return;"?) in php shell code on line 2
To Top