Descubra as principais novidades do PHP 8.5
Marcos Marcolin • November 21, 2025
php php85 phprfcNovidades 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.
- O atributo
#[\Override]também pode ser usado em propriedades. - O atributo
#[\Deprecated]passa a funcionar em traits e constantes.
Melhorias em propriedades
- Propriedades estáticas agora suportam visibilidade assimétrica.
- Propriedades promovidas no construtor podem ser marcadas como final.
Novidades em funções e API interna
- Novo método
Closure::getCurrent(), útil para recursão em closures. setcookie()esetrawcookie()agora aceitam a chave partitioned.- Novas funções:
get_error_handler()eget_exception_handler(). - Nova função
grapheme_levenshtein()para strings multibyte. - Métodos novos em DOM:
Dom\Element::getElementsByClassName()eDom\Element::insertAdjacentHTML().
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
- O operador backtick como alias de
shell_exec()foi descontinuado. - Casts não canônicos como
(boolean),(integer),(double)e(binary)também foram descontinuados. Use(bool),(int),(float)e(string).
Ajustes no engine e sintaxe
- A diretiva INI
disable_classesfoi removida. - Finalizar
casecom ponto e vírgula foi descontinuado. - Usar
nullcomo índice de array ou ao chamararray_key_exists()agora é descontinuado. Use string vazia. - Não é mais possível usar
arrayecallablecomo nomes de alias emclass_alias().
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
- Agora um aviso é emitido ao converter
NANpara outro tipo. - Desestruturar valores que não sejam arrays (exceto
null) usando[]oulist()agora emite aviso. - Conversões de
floats(oustringsque parecemfloats) paraintque não cabem mais no tipo também geram aviso.
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!