<?php
function swap( &$a, &$b ): void
{ [ $a, $b ] = [ $b, $a ]; }
?>
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...
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.
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
}
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. 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) {
//
}
}
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
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
}
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'.
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 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"
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
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.
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