<?php
function swap( &$a, &$b ): void
{ [ $a, $b ] = [ $b, $a ]; }
?>
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...
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.
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
}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;
}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) {
//
}
}
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
}
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
}
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'.
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 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"
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
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.
Se ha añadido la opción del contexto de flujo tcp_nodelay.
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