PHP 8.5 na prática: as funcionalidades que vais mesmo usar

Por Ricardo Ribeiro · · 3 min de leitura · PHP, Web Development

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.

← Todos os artigos

Privacidade · Cookies

Tens um site WordPress que não para de se partir? Vê o que faço e como trabalho.