Descubra as principais novidades do PHP 8.5

Marcos Marcolin • November 21, 2025

php php85 phprfc

Novidades do PHP 8.5 🐘

Como já virou tradição na última década, o PHP recebe uma nova versão todos os anos, e agora é a vez do PHP 8.5.

Se você acompanha este blog ou meu LinkedIn, provavelmente já viu algumas das novidades, pois costumo comentar as RFCs e mudanças mais importantes ao longo do ano.

Neste post, trago um resumo das principais melhorias do 8.5. Separei o que mais faz diferença no dia a dia, já que muita coisa foi desenvolvida ao longo do ano para deixar a linguagem mais simples, mais rápida e mais consistente.

Extensão URI: análise e manipulação de URLs com API moderna - RFC

A nova extensão URI agora vem sempre disponível no PHP 8.5. Ela fornece APIs próprias para analisar e modificar URIs e URLs seguindo os padrões RFC 3986 e WHATWG URL.

A implementação garante um parsing muito mais consistente que o parse_url, que sempre teve limitações e diferenças de comportamento.

PHP 8.4 e anteriores

$components = parse_url('https://php.net/releases/8.4/pt_BR.php');
var_dump($components['host']);
// string(7) "php.net"

PHP 8.5

use Uri\Rfc3986\Uri;
$uri = new Uri('https://php.net/releases/8.5/pt_BR.php');
var_dump($uri->getHost());
// string(7) "php.net"

Operador Pipe: encadeamento mais limpo e legível - RFC

O operador pipe facilita o encadeamento de funções sem criar variáveis intermediárias e sem aninhar chamadas. O fluxo fica de cima para baixo, muito mais fácil de ler, manter e evoluir.

PHP 8.4 e anteriores

$title = ' PHP 8.5 Lançado ';

$slug = strtolower(
    str_replace('.', '',
        str_replace(' ', '-',
            trim($title)
        )
    )
);

var_dump($slug);
// string(15) "php-85-lançado"

PHP 8.5

$title = ' PHP 8.5 Lançado ';

$slug = $title
    |> trim(...)
    |> (fn($str) => str_replace(' ', '-', $str))
    |> (fn($str) => str_replace('.', '', $str))
    |> strtolower(...);

var_dump($slug);
// string(15) "php-85-lançado"

Você pode conferir minha explicação completa neste link.

Clone With: modifique propriedades direto no clone - RFC

O PHP 8.5 introduziu a possibilidade de alterar propriedades durante a clonagem, passando um array associativo para a função clone(). Isso simplifica o padrão de métodos “with”, muito comum em classes readonly, eliminando código repetitivo para reconstruir objetos.

PHP 8.4 e anteriores

readonly class UserProfile
{
    public function __construct(
        public string $name,
        public string $email,
        public string $role = 'user',
    ) {}

    public function withRole(string $role): self
    {
        $data = get_object_vars($this);
        $data['role'] = $role;

        return new self(...$data);
    }
}

$profile = new UserProfile('Marcos', 'marcos@example.com');
$admin = $profile->withRole('admin');

PHP 8.5

readonly class UserProfile
{
    public function __construct(
        public string $name,
        public string $email,
        public string $role = 'user',
    ) {}

    public function withRole(string $role): self
    {
        return clone($this, [
            'role' => $role,
        ]);
    }
}

$profile = new UserProfile('Marcos', 'marcolindev@gmail.com');
$admin = $profile->withRole('admin');

Atributo #[\NoDiscard]: garanta que o retorno seja usado - RFC

O atributo #[\NoDiscard] permite marcar funções cujo valor retornado não deve ser ignorado. Se o retorno não for utilizado, o PHP emitirá um aviso. Isso aumenta a segurança de APIs em que o retorno é essencial, evitando erros silenciosos.

Se você realmente quiser descartar o valor, pode usar o cast (void) para deixar essa intenção explícita.

PHP 8.4 e anteriores

function getPhpVersion(): string
{
    return 'PHP 8.4';
}

getPhpVersion(); // Sem warning

PHP 8.5

#[\NoDiscard]
function getPhpVersion(): string
{
    return 'PHP 8.5';
}

getPhpVersion();
// Warning: The return value of function getPhpVersion() should either be used or intentionally ignored

Você pode conferir minha explicação completa neste link.

Closures e first-class callables em expressões constantes - RFC - RFC

O PHP 8.5 agora permite usar closures estáticas e first-class callables em expressões constantes. Isso inclui parâmetros de atributos, valores padrão de propriedades e parâmetros, além de constantes dentro da classe.

Esse recurso abre espaço para configurações mais expressivas e reutilizáveis, sem necessidade de funções auxiliares ou blocos adicionais.

PHP 8.4 e anteriores

class Example
{
    const HANDLER = fn() => 'test'; // Fatal error
}

PHP 8.5

class Example
{
    const HANDLER = (static fn() => 'test');

    public function run(): string
    {
        return (self::HANDLER)();
    }
}

$e = new Example();
var_dump($e->run()); 
// string(4) "test"

Você pode conferir minha explicação completa neste link.

cURL Share Handles persistentes - RFC - RFC

O PHP 8.5 introduziu curl_share_init_persistent(), que cria share handles persistentes. Diferente de curl_share_init(), esses handles não são destruídos ao final da requisição. Se outro handle com as mesmas opções já existir, ele será reutilizado, evitando custo de inicialização e melhorando a performance de requisições repetidas.

PHP 8.4 e anteriores

$sh = curl_share_init();
curl_share_setopt($sh, CURLSHOPT_SHARE, CURL_LOCK_DATA_DNS);
curl_share_setopt($sh, CURLSHOPT_SHARE, CURL_LOCK_DATA_CONNECT);

$ch = curl_init('https://php.net/');
curl_setopt($ch, CURLOPT_SHARE, $sh);

curl_exec($ch);

PHP 8.5

$sh = curl_share_init_persistent([
    CURL_LOCK_DATA_DNS,
    CURL_LOCK_DATA_CONNECT,
]);

$ch = curl_init('https://php.net/');
curl_setopt($ch, CURLOPT_SHARE, $sh);

// Isso agora pode reutilizar a conexão de uma requisição SAPI anterior
curl_exec($ch);

Funções array_first() e array_last() - RFC

O PHP 8.5 ganhou duas funções novas para trabalhar com arrays: array_first() e array_last().

Elas retornam, respectivamente, o primeiro e o último valor do array. Se o array estiver vazio, retornam null, o que facilita muito quando combinadas com o operador ??.

PHP 8.4 e anteriores

$lastEvent = $events === []
    ? null
    : $events[array_key_last($events)];

PHP 8.5

$lastEvent = array_last($events);

Você pode conferir minha explicação completa neste link.

Recursos e melhorias adicionais

Além dos principais recursos do PHP 8.5, várias melhorias menores foram adicionadas para tornar o desenvolvimento mais seguro, consistente e previsível.

Backtrace em erros fatais

Erros fatais, como tempo máximo de execução excedido, agora exibem um backtrace para facilitar a investigação.

Atributos mais flexíveis

Atributos agora podem ser aplicados a constantes.

Melhorias em propriedades

Novidades em funções e API interna

Atributo #[\DelayedTargetValidation]

O uso do atributo #[\DelayedTargetValidation] permite suprimir erros de compilação de atributos aplicados a alvos inválidos, útil para extensões e atributos internos.

Descontinuações e quebras de compatibilidade

Sintaxe e operadores

Ajustes no engine e sintaxe

Serialização e lifecycle

Os métodos mágicos__sleep() e __wakeup() foram suavemente descontinuados. O recomendado é usar __serialize() e __unserialize().

Conversões e avisos adicionais

Considerações finais

Na minha visão, o PHP 8.5 reforça o quanto a linguagem continua evoluindo de forma consistente. Os novos recursos são úteis no dia a dia, resolvem problemas reais e deixam o código mais claro e moderno.

Acompanhar o core da linguagem segue sendo algo que gosto bastante. Mesmo sem entender todos os detalhes internos, dá para ver o cuidado com performance, segurança e qualidade do runtime.

E, sinceramente, não preciso entrar naquela discussão antiga sobre o que o PHP “é ou não é”. A linguagem continua entregando, continua crescendo e segue extremamente relevante por mérito próprio.

Você pode conferir todas as mudanças no
site oficial do PHP.

Até a próxima!