Declarações de tipo para parâmetros e valores de retorno agora podem ser marcados como anuláveis, prefixando-se o nome do tipo com um ponto de interrogação. Isto significa que assim como o tipo especificado, null
também pode ser passado como argumento, ou retornado como um valor, respectivamente.
<?php
function testReturn(): ?string
{
return 'elePHPant';
}
var_dump(testReturn());
function testReturn(): ?string
{
return null;
}
var_dump(testReturn());
function test(?string $name)
{
var_dump($name);
}
test('elePHPant');
test(null);
test();
O exemplo acima produzirá:
string(10) "elePHPant" NULL string(10) "elePHPant" NULL Uncaught Error: Too few arguments to function test(), 0 passed in...
Um tipo de retorno void foi introduzido. Funções declaradas com void como seu tipo de retorno precisam omitir totalmente a instrução de retorno, ou usar uma instrução de retorno vazia. null
não é um valor de retorno válido para uma função 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);
O exemplo acima produzirá:
null int(2) int(1)
Tentar usar um valor de retorno de uma função void simplesmente é avaliado como null
, sem alertas emitidos. A razão para isso é que alertas implicariam no uso de funções would implicate the use of funções genéricas de ordem superior.
A sintaxe curta de array ([]
) agora pode ser usada para desestruturar arrays para atribuições (incluindo dentro de foreach
), como uma alternativa para a sintaxe list() existente, o que ainda é suportado.
<?php
$data = [
[1, 'Tom'],
[2, 'Fred'],
];
// estilo list()
list($id1, $name1) = $data[0];
// estilo []
[$id1, $name1] = $data[0];
// estilo list()
foreach ($data as list($id, $name)) {
// lógica aqui com $id e $name
}
// estilo []
foreach ($data as [$id, $name]) {
// lógica aqui com $id e $name
}
Foi adicionado suporte para especificação de visibilidade de constantes de classe.
<?php
class ConstDemo
{
const PUBLIC_CONST_A = 1;
public const PUBLIC_CONST_B = 2;
protected const PROTECTED_CONST = 3;
private const PRIVATE_CONST = 4;
}
Um novo pseudo-tipo (similar a callable) chamado iterable (iterável) foi introduzido. Pode ser usado em tipos de parâmetros e valores de retorno, onde aceita tanto arrays quanto objetos que implementam a interface Traversable. Com respeito à sub-tipagem, tipos de parâmetros de classes filhas podem ampliar uma declaração de classe pai de um array ou Traversable para um iterable. Com tipos de retorno, classes filhas podem estreitar um tipo de retorno da classe pai de iterable para array ou um objeto que implemente Traversable.
<?php
function iterator(iterable $iter)
{
foreach ($iter as $val) {
//
}
}
Exceções múltiplas por bloco de captura podem agora ser especificadas usando o caractere de barra vertical (|
). Isto é útil para quando exceções diferentes de hierarquias de classe diferentes são manipuladas ao mesmo tempo.
<?php
try {
// algum código
} catch (FirstException | SecondException $e) {
// manipula a primeira e a segunda exceções
}
Agora pode-se especificar chaves na função list(), ou sua nova sintaxe curta []
. Isto habilita desestruturação de arrays com chaves não inteiras ou não sequenciais.
<?php
$data = [
["id" => 1, "name" => 'Tom'],
["id" => 2, "name" => 'Fred'],
];
// estilo list()
list("id" => $id1, "name" => $name1) = $data[0];
// estilo []
["id" => $id1, "name" => $name1] = $data[0];
// estilo list()
foreach ($data as list("id" => $id, "name" => $name)) {
// lógica aqui com $id e $name
}
// estilo []
foreach ($data as ["id" => $id, "name" => $name]) {
// lógica aqui com $id e $name
}
Suporte a deslocamentos de string negativos foi adicionado às funções de manipulação de string que aceitam deslocamentos, assim como para indexação de string com []
ou {}
. Nestes casos, um deslocamento negativo é interpretado como sendo um deslocamento a partir do final da string.
<?php
var_dump("abcdef"[-2]);
var_dump(strpos("aabbcc", "b", -3));
O exemplo acima produzirá:
string (1) "e" int(3)
Deslocamento negativo de string e array agora também é suportado na sintaxe avaliativa simples de variáveis dentro de strings.
<?php
$string = 'bar';
echo "O último caractere de '$string' é '$string[-1]'.\n";
?>
O exemplo acima produzirá:
O último caractere de 'bar' é 'r'.
Suporte para AEAD (modos GCM e CCM) foi adicionado através da extensão das funções openssl_encrypt() e openssl_decrypt() com parâmetros adicionais.
Um novo método estático foi introduzido à classe Closure para permitir que objetos do tipo callable sejam facilmente convertidos em objetos da classe Closure.
<?php
class Test
{
public function exposeFunction()
{
return Closure::fromCallable([$this, 'privateFunction']);
}
private function privateFunction($param)
{
var_dump($param);
}
}
$privFunc = (new Test)->exposeFunction();
$privFunc('algum valor');
O exemplo acima produzirá:
string(11) "algum valor"
Uma nova função chamada pcntl_async_signals() foi introduzida para habilitar manipulação assíncrona de sinal sem usar ticks (que introduzem muita sobrecarga).
<?php
pcntl_async_signals(true); // liga sinais assíncronos
pcntl_signal(SIGHUP, function($sig) {
echo "SIGHUP\n";
});
posix_kill(posix_getpid(), SIGHUP);
O exemplo acima produzirá:
SIGHUP
Support a push de servidor foi adicionado à extensão CURL (requer versão 7.46 e superior). Isto pode ser aproveitado pela função curl_multi_setopt() com a nova constante CURLMOPT_PUSHFUNCTION
. As constantes CURL_PUSH_OK
e CURL_PUSH_DENY
também foram adicionadas de forma que a execução da chamada de push do servidor possa ser tanto aprovada quanto negada.
A opção de contexto de fluxo tcp_nodelay foi adicionada.