PHP 8.3.21 Released!

Nuevas funcionalidades

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 resultado del ejemplo sería:

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 resultado del ejemplo sería:

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 resultado del ejemplo sería:

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 resultado del ejemplo sería:

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 resultado del ejemplo sería:

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 resultado del ejemplo sería:

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.

add a note

User Contributed Notes 2 notes

up
75
DYM
7 years ago
<?php
function swap( &$a, &$b ): void
{ [ $a, $b ] = [ $b, $a ]; }
?>
up
26
unti1x
7 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