Novidades do PHP 8.5
(stitcher.io)- O PHP 8.5 é uma grande atualização que inclui vários recursos, como operador pipe, clone with e novo parser de URI
- O operador pipe simplifica cadeias de chamadas de função, melhorando a legibilidade e a manutenção
- O recurso clone with permite alterar valores de propriedades ao mesmo tempo em que o objeto é clonado, com algumas restrições para propriedades readonly
- Recursos voltados à conveniência do desenvolvedor, como
#[NoDiscard], cast(void), suporte a expressões constantes com closures e exibição de backtrace em fatal errors, também foram reforçados - A versão inclui melhorias detalhadas em manipulação de arrays, validação de atributos e descontinuação de casts não padronizados, além de mudanças relacionadas à compatibilidade retroativa
Principais novos recursos
-
Introdução do operador pipe (
|>), permitindo escrever código em cadeia que passa diretamente o resultado de uma função para a próxima- Suporta uma estrutura de transformação de dados em etapas, em vez de chamadas de função aninhadas
- No código de exemplo,
trim,str_replaceestrtolowersão conectados em sequência
-
O recurso clone with permite alterar valores de propriedades ao mesmo tempo em que o objeto é clonado
- Na classe de exemplo
Book, ele é usado no formatoclone($this, ['title' => $title]) - Porém, ao clonar propriedades readonly externamente, é necessário o modificador de acesso
public(set)
- Na classe de exemplo
-
Adição do atributo
#[NoDiscard]e do cast(void)- É possível marcar funções que geram aviso quando o valor de retorno é ignorado
- O cast
(void)pode ser usado para suprimir esse aviso
-
Com as melhorias em closures, agora é possível usar closures e callables de primeira classe em expressões constantes
- No exemplo, a definição aparece dentro de um atributo no formato
#[SkipDiscovery(static function (...))] - Essas closures devem obrigatoriamente ser declaradas como
statice não podem acessar variáveis externas
- No exemplo, a definição aparece dentro de um atributo no formato
-
Adição da exibição de backtrace em fatal errors
- Informações de rastreamento de pilha que antes não eram mostradas agora passam a ser incluídas na mensagem de erro, facilitando o debugging
Recursos relacionados a arrays e URI
-
Adição das funções
array_first()earray_last()- Retornam de forma simples o primeiro e o último elemento de um array
- Substituem a abordagem mais complexa baseada em
array_key_first()earray_key_last()
-
Adição de um novo parser de URI
- A classe
Uri\Rfc3986\Urifornece métodos comogetHost(),getScheme()egetPort() - Simplifica a manipulação e a análise de URIs
- A classe
Recursos relacionados a atributos e validação
- Introdução do atributo
#[DelayedTargetValidation]- Permite adiar o momento de validação de alguns atributos, como
#[Override], do tempo de compilação para o tempo de execução - O objetivo é aliviar problemas de compatibilidade retroativa
- Permite adiar o momento de validação de alguns atributos, como
Outras pequenas mudanças
- Suporte a visibilidade assimétrica em propriedades estáticas
- Agora é possível aplicar atributos também a constantes fora de classes
- A property promotion do construtor agora também pode ser aplicada a propriedades final
- O atributo
#[\Override]agora também pode ser aplicado a propriedades - Adição da propriedade
Dom\Element::$outerHTML - A extensão Exif passa a oferecer suporte a imagens HEIF/HEIC
- Adição da flag
FILTER_THROW_ON_FAILUREem chamadas defilter_var()
Descontinuações e mudanças incompatíveis
- Descontinuação do uso de nomes de cast não padronizados como
(boolean)e(integer) - Descontinuação do uso de crases (```) como alias de
shell_exec() - Descontinuação do recurso de redeclaração de constantes
- Remoção da configuração ini
disabled_classes - A lista completa de mudanças e descontinuações pode ser consultada na documentação de upgrade do PHP 8.5
Resumo geral
- O PHP 8.5 é uma versão que melhora a experiência geral de desenvolvimento em áreas como legibilidade de código, debugging, tratamento de atributos e manipulação de arrays
- O operador pipe e o parser de URI têm impacto direto na simplificação do código em aplicações reais
- Mudanças como adiamento da validação de atributos, novas funções de array e exibição de backtrace aumentam a manutenção e a estabilidade
- Algumas sintaxes e configurações não padronizadas foram descontinuadas, exigindo ajustes no código
- No geral, é uma release focada em reforçar a consistência da linguagem e melhorar a conveniência para desenvolvedores
1 comentários
Comentários do Hacker News
Eu ainda amo PHP
Criei um software de criptografia para PHP há 23 anos e ele ainda funciona bem
Ainda mantenho uma newsletter sobre PHP, e a comunidade continua forte
Também uso Python e Node.js, mas para tarefas rápidas e simples sempre acabo voltando para PHP
Ainda assim, o fato de a linguagem ter ficado muito mais complexa depois do PHP 5 parece uma faca de dois gumes
Enquanto Python passava do 2 para o 3, PHP evoluiu de 5.2→5.3 e 5.6→7.0
Com namespaces, autoloading PSR0, melhorias no parser e outras mudanças, velocidade e estrutura melhoraram bastante
A cada atualização, a linguagem foi evoluindo sem quebrar compatibilidade de forma brusca, oferecendo avisos e shims para manter versões antigas funcionando
O cancelamento do PHP 6 aconteceu por causa de mudanças no tratamento de strings e, no fim das contas, foi uma decisão sensata
Foi um projeto que respeitou a linguagem e a comunidade que sustentaram tanta gente por tanto tempo
Dá para escrever de forma complexa, mas isso não é obrigatório
Mexi com ferramentas ligadas ao Zend em meados dos anos 2000, e lembro que eram bem complicadas
Se você aprender PSR e levar em conta segurança e recursos, ele virou uma linguagem muito mais estável e poderosa
A evolução desde o PHP 5 é impressionante, mas junto veio também o problema do aumento de complexidade
Para quem aprendeu nas versões antigas, codebases modernas podem parecer estranhas e difíceis de acompanhar
Isso é uma força para a comunidade, mas vira uma barreira para desenvolvedores que estão voltando
Usei C++ por 10 anos, mas hoje PHP é muito mais fácil de ler do que código moderno em C++
Parece que o objetivo de simplicidade desapareceu, e só vão empilhando funcionalidades
A área web muda especialmente rápido, então quem não acompanha fica para trás
PHP é uma linguagem especialmente usada por iniciantes criando seu primeiro site, então a sensação de mudança pode ser maior do que em outras linguagens
Muita gente tende a ter vergonha de PHP, mas eu não
Não conheço a linguagem a fundo, mas sei que há muitos projetos excelentes
Meu projeto favorito em PHP hoje é o BookStack, que uso como wiki da família
Ainda existem muitos sites feitos com uma stack PHP bem mantida
Usei PHP em produção entre 2021 e 2023, e os problemas não estavam tanto na linguagem, mas em codebases antigas e salários baixos
Há muito código legado da época do PHP 4, com padrões de acesso a dados inconsistentes, o que dificulta bastante a manutenção
Mas, ao migrar para PHP 8, a qualidade do código melhorou muito
Eu não escolheria PHP para começar um projeto novo, mas participaria com prazer de um projeto moderno em Laravel
Mas iniciantes conseguiam começar sem noções de segurança, então problemas como SQL injection eram comuns, e isso acabou dando à linguagem a fama de “insegura”
Com um framework como Laravel, é um ambiente muito mais estável e maduro
É como tocar guitarra ou escrever poesia: qualquer um pode fazer, mas fazer bem é difícil
Aprendo olhando o código e gosto da experiência de hospedar meu próprio servidor de rádio/música
PHP se tornou uma linguagem cada vez mais complexa a cada atualização
Continua sendo uma linguagem centrada na web, então fico em dúvida sobre por que ela evolui tanto assim
No fim, parece que as linguagens orientadas a objetos tradicionais estão convergindo para uma direção parecida
Mesmo sendo uma linguagem voltada para web, há muitos motivos para ela continuar evoluindo. Melhorar a experiência do desenvolvedor sempre vale a pena
array_first() e array_last() são úteis, mas o operador pipe pode prejudicar a manutenibilidade
Como ele só suporta funções unárias, em funções mais complexas pode acabar introduzindo bugs
O ponto mais interessante do anúncio do PHP 8.5 é a estabilidade e maturidade da linguagem
Impressiona que o PHP vai adicionar array_first, array_last e fatal error stack trace antes de GTA6
Continuar adicionando novas funções e sintaxe ao PHP aumenta o custo de manutenção no longo prazo
Pelas notas oficiais de release, alguns recursos têm valor discutível
parse_url()existenteNotas oficiais de release do PHP 8.5
Os exemplos do operador pipe em muitas linguagens apenas omitem a abordagem comum de usar variáveis temporárias
O exemplo de parsing de URL também não foi comparado diretamente com
parse_url()parse_url()não segue totalmente o padrão e lida mal com URLs relativasA nova função
uri()é mais limpa e, se adicionarem aplicação parcial de função, a cadeia com pipe ficará mais legívelEu costumava usar **crases (
) no PHP CLI para chamarshell_exec()**, mas isso agora foi deprecated Usava muito coisas comomkdir $dirname`Há risco de injeção de metacaracteres do shell, então o ideal é usar
mkdir()oupcntl_exec()do próprio PHP