Pular para o conteúdo
Setup do Dev
Publicidade
Programação

PHP 8.5: operador pipe, extensão URI e o que mais mudou na linguagem

O que entrou na versão 8.5, com exemplos de código: pipe, clone com propriedades, #[\NoDiscard], array_first() e as descontinuações que pedem atenção.

Por Setup do Dev
3 min de leitura
Compartilhar
Capa do Setup do Dev com o logo do PHP: "O que mudou no PHP 8.5", com o código do operador pipe em pixel art e o símbolo |> em destaque
Logo do PHP: Colin Viebrock, <a href="https://creativecommons.org/licenses/by-sa/4.0/deed.pt-br" target="_blank" rel="noopener">CC BY-SA 4.0</a>

O PHP 8.5 não muda a cara da linguagem, mas mexe em coisas que aparecem todo dia no código: encadear funções, copiar objetos imutáveis, ler URLs e pegar o último item de um array. A página oficial do lançamento traz cada recurso com o antes e o depois. Aqui vai o que mais interessa a quem escreve PHP, com os exemplos de lá.

O operador pipe

A novidade mais visível é o operador |>. Ele passa o resultado de uma função para a próxima, da esquerda para a direita, sem variável intermediária e sem aquela pilha de chamadas aninhadas que se lê de dentro para fora. O exemplo oficial monta um slug a partir de um título. Antes:

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

No 8.5:

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

Repare no trim(...): é a sintaxe de first-class callable, que entrega a função sem chamá-la. Quando a função precisa de mais de um argumento, como o str_replace, entra uma arrow function no meio.

Clone com propriedades novas

Quem usa classes readonly conhece o trabalho de escrever métodos “with”: para mudar uma propriedade, é preciso montar um objeto novo inteiro. O 8.5 deixa a função clone() receber um array com as propriedades a alterar:

readonly class Color
{
    public function __construct(
        public int $red,
        public int $green,
        public int $blue,
        public int $alpha = 255,
    ) {}

    public function withAlpha(int $alpha): self
    {
        return clone($this, ['alpha' => $alpha]);
    }
}

Antes, o mesmo método precisava copiar as propriedades com get_object_vars(), trocar a que mudava e chamar o construtor de novo.

Uma extensão nativa para URLs

A extensão URI vem sempre ativa e traz classes para analisar e modificar endereços seguindo os padrões RFC 3986 e WHATWG URL, com base nas bibliotecas uriparser e Lexbor. É a alternativa orientada a objeto ao velho parse_url():

use Uri\Rfc3986\Uri;

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

#[\NoDiscard], array_first() e outros recursos menores

O atributo #[\NoDiscard] faz o PHP emitir um aviso quando o valor de retorno de uma função é ignorado. Serve para APIs em que esquecer o retorno é bug, e o descarte proposital passa a ser explícito, com o cast (void).

Publicidade

As funções array_first() e array_last() devolvem o primeiro e o último valor de um array, ou null quando ele está vazio, o que combina com o operador ??:

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

// no 8.5
$lastEvent = array_last($events);

Também entraram: closures estáticas e first-class callables em expressões constantes (inclusive em parâmetros de atributos); share handles persistentes do cURL, com curl_share_init_persistent(), que reaproveitam conexão e DNS entre requisições; backtrace nos erros fatais, como o de tempo máximo de execução; #[\Override] em propriedades; final em propriedades promovidas no construtor; e Closure::getCurrent(), que facilita recursão em funções anônimas.

O que foi descontinuado

Antes de atualizar, vale procurar no código o que passou a gerar aviso ou deixou de existir:

  • o operador de crase (`comando`) como atalho de shell_exec();
  • os casts (boolean), (integer), (double) e (binary), que dão lugar a (bool), (int), (float) e (string);
  • case terminado em ponto e vírgula, em vez de dois-pontos;
  • null como índice de array ou em array_key_exists();
  • __sleep() e __wakeup(), descontinuados de forma branda em favor de __serialize() e __unserialize();
  • a diretiva disable_classes do php.ini, que foi removida.

Há ainda avisos novos ao converter NAN para outros tipos, ao desestruturar com [] ou list() algo que não é array, e ao converter para int um float que não cabe num inteiro. Nenhum desses quebra o código na hora, mas os avisos aparecem no log, e é melhor resolvê-los antes que virem erro numa versão futura.

Para quem mantém projeto em produção, o caminho seguro é rodar a suíte de testes no 8.5 e ler o guia de migração oficial antes de trocar a versão do servidor.

Fonte: PHP.net: lançamento do PHP 8.5

Produzido com auxílio de IA e revisado pela redação.

Publicidade

Comentários (0)

Ainda não há comentários. Comece a conversa.

Deixe seu comentário

Seu e-mail não será publicado. O primeiro comentário de cada pessoa passa por moderação.

Seja respeitoso
Publicidade

Neste artigo

  1. O operador pipe
  2. Clone com propriedades novas
  3. Uma extensão nativa para URLs
  4. #[\NoDiscard], array_first() e outros recursos menores
  5. O que foi descontinuado

Mais lidas

Editorias

Publicidade

Leia também

Newsletter semanal

O essencial da tecnologia, toda sexta no seu e-mail

Uma curadoria da redação com as notícias que importam para quem desenvolve, joga e trabalha com tecnologia. Sem spam.

Ao assinar, você concorda com a política de privacidade. Cancele quando quiser.

Publicidade