PHPerKaigi 2024

Novas funcionalidades

Tipos anuláveis

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...

Funções void

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.

Desestruturação simétrica de array

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
}

Visibilidade de constante de classe

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;
}

Pseudo-tipo iterable

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) {
//
}
}

Manipulação de exceção com multi-captura

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
}

Suporte para chaves em list()

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 deslocamento negativo em string

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 a AEAD em ext/openssl

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.

Conversão de chamáveis para Closures com Closure::fromCallable()

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"

Manipulação assíncrona de sinal

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

Suporte a push de servidor HTTP/2 em ext/curl

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.

Opções de Contexto de Fluxo

A opção de contexto de fluxo tcp_nodelay foi adicionada.

add a note

User Contributed Notes 2 notes

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