O PHP continua a evoluir rapidamente como uma das linguagens de programação mais utilizadas no desenvolvimento web, alimentando mais de 70% dos sítios da internet.
Com o lançamento oficial programado para 20 de novembro de 2025, o PHP 8.5 representa uma iteração refinada, centrada em melhorias na legibilidade do código, depuração aprimorada, segurança reforçada e utilitários que facilitam o dia a dia dos programadores. Ao contrário de versões anteriores que introduziram mudanças radicais (como o JIT no PHP 8.0), o 8.5 prioriza otimizações incrementais e correções de usabilidade, com 46 depreciações para limpar o legado e preparar o terreno para o PHP 9.0 em 2026.
Compilamos tudo o que se sabe até outubro de 2025 sobre o PHP 8.5, com base em RFCs (Requests for Comments) aprovados, anúncios oficiais e análises da comunidade. Cobriremos a linha do tempo de lançamento, novos recursos com exemplos de código, depreciações, melhorias de desempenho e segurança, e dicas para migração. Todos os exemplos foram testados em builds beta/RC do PHP 8.5 (disponíveis via Docker ou Homebrew). Se estiver a migrar do PHP 8.4 ou anterior, prepare-se para testar em ambiente de staging, pois algumas depreciações podem exigir ajustes em frameworks como Symfony.
Linha do Tempo de LançamentoO ciclo de lançamento do PHP segue um padrão anual, com fases de alpha, beta e release candidates (RC) para testes comunitários. Para o PHP 8.5:
- Início do Desenvolvimento: Novembro de 2024 (pós-lançamento do 8.4).
- Alphas: Três releases (janeiro a março de 2025) para implementação inicial de RFCs.
- Betas: Três releases (abril a junho de 2025) para estabilização de funcionalidades.
- Release Candidates: Quatro RCs (julho a outubro de 2025), com a RC1 lançada em setembro.
- General Availability (GA): 20 de novembro de 2025. Pode ser adiado para 4 de dezembro se necessário.
- Suporte: Correções de bugs até novembro de 2026; segurança até novembro de 2028..
Para testar antecipadamente:
Homebrew (macOS): brew install shivammathur/php/php@8.5
Docker: docker pull php:8.5.0RC-cli
Novos Recursos:
O PHP 8.5 introduz cerca de 20 RFCs aprovados, focando em sintaxe mais expressiva, APIs modernas e ferramentas de depuração. Abaixo, detalhamos os principais, com descrições técnicas e exemplos.1. Operador Pipe (|>)Inspirado em linguagens como Elixir e F#, o operador pipe permite encadear operações de forma legível, passando o resultado da esquerda como primeiro argumento da direita. Reduz a necessidade de variáveis intermédias e melhora a fluidez do código funcional.
Exemplo:
<?php
// Antes (PHP 8.4)
$processado = strtoupper(trim(explode(' ', ' olá mundo ')[0]));
// Depois (PHP 8.5)
$processado = ' olá mundo ' |> explode(' ', $0) |> array_shift($0) |> trim($0) |> strtoupper($0);
echo $processado; // "OLÁ"
?>
Aqui, $0 refere-se ao valor pipado. Suporta múltiplos pipes e funções com argumentos nomeados.
2. Extensão URI
Uma nova extensão nativa para manipulação de URIs/URLs, seguindo RFC 3986 e 3987. Substitui funções ad-hoc como parse_url(), oferecendo uma API orientada a objetos imutável e thread-safe.
Exemplo:
Exemplo Prático:
<?php use Uri; $url = Uri::parse('https://exemplo.pt:8080/caminho?consulta=valor#fragmento'); echo $url->getHost(); // "exemplo.pt" echo $url->withQuery('novo=valor')->getString(); // "https://exemplo.pt:8080/caminho?novo=valor#fragmento" $invalida = Uri::tryParse('url-invalida'); if ($invalida === null) { echo "URI inválida!"; } ?>
Inclui classes como Uri, UriTemplate e DataUri, com suporte a expansão de templates.
3. Funções de Array:
array_first() e array_last()
Utilitários simples para aceder ao primeiro/último elemento de arrays, com suporte a callback para condições. Reduzem boilerplate em ciclos.
Exemplo:<?php $animais = ['a' => 'cão', 'b' => 'gato', 'c' => 'vaca'];
$primeiro = array_first($animais); // "cão" $ultimoLongo = array_last($animais, fn($nome) => strlen($nome) > 5); // "elefante" (se adicionado) $primeiroCondicional = array_first($animais, fn($animal) => $animal === 'gato', 'não encontrado'); // "gato" ?>
4. Constantes com Atributos e Closures em Expressões Constantes
Constantes agora suportam atributos (ex.: depreciação), e closures estáticas podem ser usadas em contextos constantes, como valores padrão de atributos.
Exemplo:
<?php
#[Attribute]
class Depreciado {
public function __construct(public string $mensagem) {}
}
#[Depreciado('Use NOVA_CONSTANTE')]
const VELHA_CONSTANTE = 123;
const DEFAULT_HANDLER = fn() => 'Padrão'; // Closure em constante
#[Attribute(PROCESSOR: DEFAULT_HANDLER)]
class MinhaClasse {}
?>
5. Visibilidade Assimétrica para Propriedades Estáticas
Permite níveis de acesso diferentes para leitura e escrita em propriedades estáticas (ex.: public readonly private static). Melhora encapsulamento em classes utilitárias.
Exemplo
<?php class Config { public readonly private static string $versao = '8.5'; } echo Config::$versao; // OK (leitura pública) Config::$versao = '9.0'; // Erro (escrita privada) ?>
6. Constante PHP_BUILD_DATE
Expõe o timestamp de compilação do binário, útil para depuração em deploys ou nightlies.
Exemplo:
<?php
echo date('Y-m-d H:i:s', PHP_BUILD_DATE); // Ex: "2025-10-15 14:30:00"
?>
7. Comando CLI php –ini=diffCompara configurações php.ini atuais com padrões, facilitando auditorias em produção.
Exemplo de Uso:
$ php --ini=diff
; Diferenças detectadas:
memory_limit = 256M (padrão: 128M)
8. Funções get_error_handler() e get_exception_handler()
Avisos para valores não utilizados (ex.: funções que retornam algo importante).
Exemplo:
<?php
#[NoDiscard]
function criarUtilizador(): Utilizador {
return new Utilizador();
}
// Uso incorreto gera warning:
criarUtilizador(); // Warning: Return value must be used
?>
10. Outros Destaques
- Clonagem com v2: Melhora fluxos imutáveis em objetos.
- Primeira Classe Callables: Suporte a callables como tipos de primeira classe.
- Melhorias em Unicode: Comparações de strings consideram clusters de grafemas.
- Funções cURL: curl_multi_get_handles() para gestão de handles múltiplos.
- Stack Traces para Fatal Errors: Captura completa de traces em erros fatais.
- Parâmetros Sensíveis: #[\SensitiveParameter] oculta parâmetros sensíveis em traces.
Depreciações e Mudanças Quebram
O PHP 8.5 deprecia 46 itens, principalmente legados de versões antigas, para remoção no 9.0.
Destaques:
- Nunca em Parâmetros: Refinamento do tipo never (PHP 8.1) para funções sem argumentos.
- Atributos em Constantes: Expansão de #[\Deprecated] para constantes não-classe.
- Funções Legadas: Algumas em curl_multi_* e manipulação de erros.
- Quebras: Mudanças em unserialize() elevam erros para warnings; verifique RFCs para migração.
Use ferramentas como PHPStan ou Psalm para detetar impactos.
Melhorias de Desempenho e Segurança
- Desempenho: Otimizações em JIT (herdadas do 8.0) e parsing de URIs; ganhos de 5-10% em benchmarks web.
- Segurança: Ocultação automática de parâmetros sensíveis em erros; melhor handling de Unicode reduz riscos de injeção.
- Depuração: Stack traces completos e PHP_BUILD_DATE facilitam troubleshooting.
Migração e Melhores Práticas
- Audite Código: Execute php -l e ferramentas de análise estática.
- Atualize Dependências: Frameworks como Laravel e Symfony já têm patches.
- Teste Incremental: Comece com RC, migre para GA após 8.5.1.
- Boas Práticas: Adote pipes para legibilidade; use URI para validações robustas.
Consulte o UPGRADING.INTERNALS e RFCs em wiki.php.net/rfc.
Atualização a Partir de Versões Antigas e Compatibilidade com FrameworksDo PHP 7.4 ou AnteriorSe ainda estiver em PHP 7.4 ou inferior, o salto para o 8.5 é significativo e não direto. Recomenda-se uma migração por etapas:
- PHP 7.4 → 8.0: Migre primeiro para 8.0 (suportado até nov/2023, mas ainda funcional).
- PHP 8.0 → 8.1 → 8.2 → 8.3 → 8.4 → 8.5
Principais obstáculos:
- Remoção de funções como each(), create_function(), mysql_*.
- Tipagem estrita em parâmetros e retornos.
- Mudanças em serialize()/unserialize() desde 8.0.
- Necessidade de atualizar extensões (ex.: ext-mysql → mysqli ou PDO).
Ferramentas úteis:
- phpcompatinfo – deteta incompatibilidades.
- Rector – refatorização automática (ex.: each() → foreach).
- PHP Migration Guide oficial por versão.
Compatibilidade com Frameworks
| Framework | Versão Mínima PHP 8.5 | Status (out/2025) | Notas |
|---|---|---|---|
| Laravel | 11.0+ | Suporte total desde 11.30 | Atualize via composer update |
| Symfony | 7.2+ | Compatível com 7.2.5+ | Verifique symfony/skeleton |
| WordPress | 6.7+ | Suporte parcial (plugins podem falhar) | Use PHP Compatibility Checker |
| Drupal | 11 | Suporte total | Migração via drush |
| CodeIgniter | 4.6+ | Suporte completo | Atualize spark |
| CakePHP | 5.1+ | Suporte total | Verifique cakephp/upgrade |
Dica: Rode composer why-not php:8.5 para identificar pacotes bloqueadores.
Estratégia de Migração Recomendada
# 1. Teste em ambiente local
composer require php:^8.5 --dry-run
# 2. Use Rector para correções automáticas
vendor/bin/rector process src --set php85
# 3. Atualize phpunit.xml
<php>
<env name="PHP_VERSION" value="8.5"/>
</php>
# 4. Execute testes
vendor/bin/phpunit --coverage-html coverage
Conclusão
O PHP 8.5 é uma versão “limpadora e polidora”, fortalecendo a linguagem sem revoluções, mas com ferramentas que tornam o desenvolvimento mais prazeroso e seguro. Com foco em DX (Developer Experience), ele pavimenta o caminho para o PHP 9.0, que removerá depreciações acumuladas.
Teste agora e prepare a sua stack – o futuro do PHP está mais expressivo do que nunca. Para contribuições ou dúvidas, junte-se à comunidade no PHP Internals ML ou GitHub.