PHP 8.5 na prática: as funcionalidades que vais mesmo usar
O que saiu de facto
O PHP 8.5 chegou em novembro de 2025 e, ao contrário de outras versões, é fácil olhar para a lista de novidades e perceber o que te vai mudar o dia e o que é para outra pessoa qualquer. Tenho-o a correr em projetos pequenos desde então. Estas são as quatro coisas que uso.
O operador pipe
O pipe pega no valor da esquerda e entrega-o como primeiro argumento da chamada da direita. Parece pouco. Não é, porque as transformações de texto são exatamente onde o código PHP fica feio.
$slug = strtolower(
str_replace('.', '',
str_replace(' ', '-', trim($title))
)
);
O mesmo com pipes lê-se de cima para baixo, que é como tu pensas nisto na realidade:
$slug = $title
|> trim(...)
|> (fn($s) => str_replace(' ', '-', $s))
|> (fn($s) => str_replace('.', '', $s))
|> strtolower(...);
Uso-o em slugs, a normalizar input e a construir cache keys. Não em todo o lado. Uma cadeia de dois passos costuma ser pior do que estar aninhada.
clone() com novos valores
Se escreves value objects, isto tira-te uma pilha de boilerplate. Em vez de um withStatus() à mão para cada propriedade, a sintaxe de clone deixa-te mudar campos enquanto copias.
$draft = new Article('Title', 'draft');
$review = clone $draft with { status: 'review' };
O original fica intacto. Em classes readonly, é a diferença entre escrever quatro métodos e não escrever nenhum.
array_first() e array_last()
Estas duas funções deviam existir há uma década. Devolvem o primeiro e o último elemento de um array, ou null quando está vazio, e aceitam um callable.
$latest = array_last($posts, fn($p) => $p->isPublished());
Antes disto escrevia $posts[array_key_first($posts)] ?? null. Já não preciso.
A que te vai valer às duas da manhã
Os erros fatais, incluindo um timeout, passam a trazer um backtrace. Só isso já justifica o upgrade num servidor de produção, porque um timeout antigamente dizia-te que o script morreu e mais nada. Agora diz-te onde é que ele estava quando morreu.
Os itens mais pequenos
#[\NoDiscard]escreve um aviso no log quando descartas um valor de retorno. Útil em funções que só existem para devolver algo, como um validador.- Os atributos podem ser aplicados a constantes e o
#[\Override]funciona em propriedades, por isso o motor avisa-te quando renomeias algo na classe pai e te esqueces da filha. - Closures estáticas e callables de primeira classe são permitidos em expressões constantes, o que dá argumentos de atributo mais limpos.
- O OPcache passa a vir dentro do binário em vez de ser uma extensão opcional. Menos surpresas no deploy.
Deves atualizar agora
Confirma primeiro as tuas dependências. Para mim o upgrade tem sido aborrecido, o que aqui é o elogio que se quer. Se estás em 8.3 ou 8.4 e o teu framework suporta 8.5, há pouca razão para esperar, e a melhoria do backtrace paga a tarde que custa.
Tens um site WordPress que não para de se partir? Vê o que faço e como trabalho.