Em resumo: O PHP 8.0 (novembro de 2020) trouxe argumentos nomeados, atributos, tipos união, match, o operador nullsafe e um compilador JIT. Seguiram-se anualmente: a 8.1 com enums e fibers, a 8.2 com classes readonly, a 8.3 com constantes de classe tipadas, a 8.4 com property hooks e a 8.5 com operador pipe e extensão URI. Cada versão também descontinua coisas antigas. No upgrade, por isso, contam os testes e, para a segurança, conta sobretudo operar um ramo suportado com o nível de patches atual.
As novidades do PHP 8 em resumo
A tabela resume os pontos principais das páginas de lançamento do php.net. Datas da primeira publicação segundo o php.net.
| Versão | Lançada | Principais novidades | Seleção de descontinuações e quebras |
|---|---|---|---|
| 8.0 | 26/11/2020 | argumentos nomeados, atributos, constructor property promotion, tipos união, match, ?->, JIT |
0 == 'foobar' é agora false, erros de tipo em vez de avisos |
| 8.1 | 25/11/2021 | enums, propriedades readonly, first-class callables strlen(...), new em inicializadores, tipos interseção, never, fibers |
– |
| 8.2 | 08/12/2022 | classes readonly, tipos DNF, null/false/true como tipos, extensão Random, constantes em traits, #[\SensitiveParameter] |
propriedades dinâmicas descontinuadas |
| 8.3 | 23/11/2023 | constantes de classe tipadas, #[\Override], json_validate(), mb_str_pad(), php -l para vários ficheiros |
– |
| 8.4 | 21/11/2024 | property hooks, visibilidade assimétrica, #[\Deprecated], nova API DOM com HTML5, BcMath\Number, array_find(), lazy objects |
parâmetros implicitamente nullable descontinuados; IMAP, OCI8, PDO_OCI, pspell para o PECL |
| 8.5 | 20/11/2025 | operador pipe, extensão URI, clone with, #[\NoDiscard], array_first()/array_last() |
operador backtick descontinuado, disable_classes removido |
PHP 8.0 e 8.1: o grande passo
O PHP 8.0 tornou a linguagem claramente mais estrita e expressiva. Segundo a página de lançamento, as funções internas lançam agora de forma consequente TypeError ou ValueError, em vez de apenas emitirem avisos. As comparações entre números e cadeias de carateres seguem regras mais limpas.
<?php
// PHP 8.0: match compara de forma estrita e não precisa de break
$status = 404;
echo match (true) {
$status >= 500 => 'Serverfehler',
$status >= 400 => 'Anfragefehler',
default => 'in Ordnung',
};
// PHP 8.0: operador nullsafe
$land = $bestellung?->kunde?->adresse?->land;
O PHP 8.1 trouxe enums, ou seja, tipos de enumeração com valores fixos, e propriedades readonly, que só podem ser definidas uma vez:
<?php
enum Rolle: string {
case Leser = 'leser';
case Redakteur = 'redakteur';
case Admin = 'admin';
}
final class Benutzer {
public function __construct(
public readonly string $name,
public readonly Rolle $rolle,
) {}
}
$b = new Benutzer('Erika', Rolle::from('redakteur'));
Rolle::from() lança um erro perante valores desconhecidos. Isto impede que cadeias de carateres arbitrárias de formulários passem como papel. Quem precisa de um valor vazio em vez de um erro usa Rolle::tryFrom(), que devolve null para valores desconhecidos.
Também novas no 8.1 são as fibers, uma base para fluxos concorrentes sobre a qual assentam bibliotecas de processamento assíncrono. Na operação normal de um site nota-se pouco, mas em frameworks modernos e em filas já se nota.
PHP 8.2 e 8.3: arrumar e proteger
O PHP 8.2 descontinuou as propriedades dinâmicas. Quem atribui a um objeto uma propriedade não declarada recebe um aviso; com #[\AllowDynamicProperties] isso pode ser permitido em classes individuais. Plugins mais antigos geram por isso muitas vezes muitas mensagens no log.
Interessantes para a segurança são a nova extensão Random, cujo randomizer por defeito usa, segundo a página de lançamento, um gerador de números aleatórios criptograficamente seguro, e o atributo #[\SensitiveParameter], que oculta valores como palavras-passe em stack traces. Mais sobre valores aleatórios seguros em Números aleatórios e tokens seguros em PHP.
O PHP 8.3 acrescentou constantes de classe tipadas, o atributo #[\Override] contra erros de escrita ao sobrescrever métodos e json_validate(), que verifica JSON sem o descodificar por completo.
PHP 8.4 e 8.5: recursos de linguagem modernos
O PHP 8.4 introduziu property hooks, isto é, lógica diretamente nas propriedades, e visibilidade assimétrica como public private(set). A isso juntaram-se uma nova API DOM com suporte a HTML5 e funções como array_find(), array_any() e array_all(). Segundo a página de lançamento, as extensões IMAP, OCI8, PDO_OCI e pspell foram movidas do núcleo para o PECL. As aplicações que usam, por exemplo, o IMAP precisam então de um pacote separado.
O PHP 8.5 trouxe o operador pipe, que encadeia chamadas da esquerda para a direita:
<?php
$slug = ' Neue Produkte 2026 '
|> trim(...)
|> strtolower(...)
|> (fn(string $s): string => str_replace(' ', '-', $s));
// Resultado: "neue-produkte-2026"
Nova é também uma extensão URI que decompõe endereços segundo o RFC 3986 e o padrão WHATWG URL. Isto é relevante para a segurança, porque URL analisados de forma inconsistente são uma causa conhecida de verificações contornadas. O operador backtick, como forma abreviada de shell_exec(), está descontinuado e a definição disable_classes foi removida. Quem a utilizava deve ajustar o seu reforço.
Novidades, upgrades e PHP2Shell
As novas funcionalidades de linguagem não fecham falhas no interpretador. Contra o PHP2Shell só ajuda o nível de patches atual do respetivo ramo: 8.5.12, 8.4.27, 8.3.36 ou 8.2.35. Para o PHP 8.1 e 8.0 já não existem atualizações oficiais. Quem aí está preso tem de fazer upgrade e, nisso, as novidades ajudam pouco, as quebras muito.
Um caminho de upgrade seguro em cinco passos:
- Definir a versão de destino, adequada aos requisitos de sistema do fabricante e ao ciclo de lançamentos.
- Levar as dependências do Composer e os plugins para versões compatíveis.
- Verificar o código com análise estática e testes contra a versão de destino.
- Experimentar num ambiente de teste com uma cópia dos dados de produção e avaliar nos logs as descontinuações.
- Mudar, reiniciar todos os processos PHP e documentar o estado.
Antecedentes sobre tipos fornece O sistema de tipos do PHP.
Como ajuda concretamente a PHP SOS?
- Verificar a compatibilidade: Analisamos o seu código e as suas extensões à procura de quebras relativamente à versão de destino.
- Executar o upgrade: Com a migração para uma versão do PHP suportada elevamos as aplicações de forma testada.
- Ajustar o reforço: Substituímos definições removidas, como
disable_classes, por alternativas eficazes. - Manter o nível de patches: Depois do upgrade, mantemos o ramo atualizado e comprovamos cada reinício.
Perguntas frequentes
Que versão do PHP 8 devo usar hoje?
Para novos projetos, PHP 8.4 ou 8.5, porque são as que ficam suportadas durante mais tempo: a 8.4 até ao fim de 2028, a 8.5 até ao fim de 2029. O decisivo é o que a sua aplicação suporta segundo os requisitos de sistema do fabricante. O PHP 8.2 termina a 31 de dezembro de 2026.
O que costuma falhar mais na passagem do PHP 7.4 para o PHP 8?
Muitas vezes são as verificações de tipos mais estritas: no PHP 8, as funções internas lançam TypeError ou ValueError em vez de apenas emitirem avisos. Também se notam as comparações alteradas entre números e cadeias de carateres. A análise estática e os testes revelam a maior parte com antecedência.
O JIT torna o meu site mais rápido?
Na maior parte dos casos, pouco. Segundo a página de lançamento do PHP 8.0, o desempenho de aplicações web típicas fica aproximadamente ao nível do PHP 7.4, enquanto tarefas de cálculo intensivo podem beneficiar claramente. Desde o PHP 8.4, o JIT está desligado por defeito.
Que novidades ajudam a segurança?
Entre outras, a nova extensão Random no PHP 8.2 com um padrão criptograficamente seguro, o atributo SensitiveParameter contra palavras-passe em stack traces, enums e propriedades readonly para dados mais inequívocos, bem como os erros de tipo mais consequentes desde o PHP 8.0.