PHP 8.5: operador pipe, extensão URI e o que mais mudou na linguagem
O que entrou na versão 8.5, com exemplos de código: pipe, clone com propriedades, #[\NoDiscard], array_first() e as descontinuações que pedem atenção.

O PHP 8.5 não muda a cara da linguagem, mas mexe em coisas que aparecem todo dia no código: encadear funções, copiar objetos imutáveis, ler URLs e pegar o último item de um array. A página oficial do lançamento traz cada recurso com o antes e o depois. Aqui vai o que mais interessa a quem escreve PHP, com os exemplos de lá.
O operador pipe
A novidade mais visível é o operador |>. Ele passa o resultado de uma função para a próxima, da esquerda para a direita, sem variável intermediária e sem aquela pilha de chamadas aninhadas que se lê de dentro para fora. O exemplo oficial monta um slug a partir de um título. Antes:
$title = ' PHP 8.5 Released ';
$slug = strtolower(
str_replace('.', '',
str_replace(' ', '-',
trim($title)
)
)
);No 8.5:
$slug = $title
|> trim(...)
|> (fn($str) => str_replace(' ', '-', $str))
|> (fn($str) => str_replace('.', '', $str))
|> strtolower(...);Repare no trim(...): é a sintaxe de first-class callable, que entrega a função sem chamá-la. Quando a função precisa de mais de um argumento, como o str_replace, entra uma arrow function no meio.
Clone com propriedades novas
Quem usa classes readonly conhece o trabalho de escrever métodos “with”: para mudar uma propriedade, é preciso montar um objeto novo inteiro. O 8.5 deixa a função clone() receber um array com as propriedades a alterar:
readonly class Color
{
public function __construct(
public int $red,
public int $green,
public int $blue,
public int $alpha = 255,
) {}
public function withAlpha(int $alpha): self
{
return clone($this, ['alpha' => $alpha]);
}
}Antes, o mesmo método precisava copiar as propriedades com get_object_vars(), trocar a que mudava e chamar o construtor de novo.
Uma extensão nativa para URLs
A extensão URI vem sempre ativa e traz classes para analisar e modificar endereços seguindo os padrões RFC 3986 e WHATWG URL, com base nas bibliotecas uriparser e Lexbor. É a alternativa orientada a objeto ao velho parse_url():
use Uri\Rfc3986\Uri;
$uri = new Uri('https://php.net/releases/8.5/en.php');
var_dump($uri->getHost()); // string(7) "php.net"#[\NoDiscard], array_first() e outros recursos menores
O atributo #[\NoDiscard] faz o PHP emitir um aviso quando o valor de retorno de uma função é ignorado. Serve para APIs em que esquecer o retorno é bug, e o descarte proposital passa a ser explícito, com o cast (void).
As funções array_first() e array_last() devolvem o primeiro e o último valor de um array, ou null quando ele está vazio, o que combina com o operador ??:
// antes
$lastEvent = $events === [] ? null : $events[array_key_last($events)];
// no 8.5
$lastEvent = array_last($events);Também entraram: closures estáticas e first-class callables em expressões constantes (inclusive em parâmetros de atributos); share handles persistentes do cURL, com curl_share_init_persistent(), que reaproveitam conexão e DNS entre requisições; backtrace nos erros fatais, como o de tempo máximo de execução; #[\Override] em propriedades; final em propriedades promovidas no construtor; e Closure::getCurrent(), que facilita recursão em funções anônimas.
O que foi descontinuado
Antes de atualizar, vale procurar no código o que passou a gerar aviso ou deixou de existir:
- o operador de crase (
`comando`) como atalho deshell_exec(); - os casts
(boolean),(integer),(double)e(binary), que dão lugar a(bool),(int),(float)e(string); caseterminado em ponto e vírgula, em vez de dois-pontos;nullcomo índice de array ou emarray_key_exists();__sleep()e__wakeup(), descontinuados de forma branda em favor de__serialize()e__unserialize();- a diretiva
disable_classesdo php.ini, que foi removida.
Há ainda avisos novos ao converter NAN para outros tipos, ao desestruturar com [] ou list() algo que não é array, e ao converter para int um float que não cabe num inteiro. Nenhum desses quebra o código na hora, mas os avisos aparecem no log, e é melhor resolvê-los antes que virem erro numa versão futura.
Para quem mantém projeto em produção, o caminho seguro é rodar a suíte de testes no 8.5 e ler o guia de migração oficial antes de trocar a versão do servidor.
Fonte: PHP.net: lançamento do PHP 8.5
Produzido com auxílio de IA e revisado pela redação.
Comentários (0)
Ainda não há comentários. Comece a conversa.




Deixe seu comentário