update page now
Laravel Live Japan
Lançado em 20 de Novembro de 2025

Mais inteligente, mais rápido, preparado para o futuro.

PHP 8.5 é uma atualização importante da linguagem PHP, com novos recursos como a extensão URI, o operador Pipe e suporte para modificar propriedades durante a clonagem.

Principais recursos do PHP 8.5

Mais rápido, mais limpo e feito para desenvolvedores.

Extensão URI

O PHP 8.5 adiciona uma extensão nativa para analisar, normalizar e manipular URLs seguindo os padrões RFC 3986 e WHATWG URL.

Operador Pipe

O operador |> permite encadear funções da esquerda para a direita, passando valores entre múltiplas chamadas sem variáveis intermediárias.

Clone With

Clone objetos e atualize propriedades usando a nova sintaxe clone(), facilitando o padrão “with-er” para classes readonly.

Atributo #[\NoDiscard]

O atributo #[\NoDiscard] emite um aviso quando o valor de retorno não é usado, ajudando a evitar erros e aumentando a segurança de APIs.

Closures e First-Class Callables em Expressões Constantes

Closures estáticas e first-class callables agora podem ser usadas em expressões constantes, como parâmetros de atributos.

cURL Share Handles Persistentes

Agora é possível manter handles compartilhados entre várias requisições PHP, evitando o custo de inicializar conexões repetidas para os mesmos hosts.

Extensão URI

A nova extensão URI, sempre disponível, fornece APIs para analisar e modificar URIs e URLs seguindo os padrões RFC 3986 e WHATWG URL.

Baseada nas bibliotecas uriparser (RFC 3986) e Lexbor (WHATWG URL).

Saiba mais sobre esse recurso no blog da The PHP Foundation.

PHP 8.4 e anteriores
$components = parse_url('https://php.net/releases/8.4/en.php');

var_dump($components['host']);
// string(7) "php.net"
PHP 8.5 NOVO RFC
use Uri\Rfc3986\Uri;

$uri = new Uri('https://php.net/releases/8.5/en.php');

var_dump($uri->getHost());
// string(7) "php.net"

Operador Pipe

O operador pipe permite encadear chamadas de função sem lidar com variáveis intermediárias. Isso substitui chamadas aninhadas por um fluxo mais legível de cima para baixo.

Saiba mais sobre os bastidores desse recurso no blog da The PHP Foundation.

PHP 8.4 e anteriores
$title = ' PHP 8.5 Released ';

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

var_dump($slug);
// string(15) "php-85-released"
PHP 8.5 NOVO RFC
$title = ' PHP 8.5 Released ';

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

var_dump($slug);
// string(15) "php-85-released"

Clone With

Agora é possível modificar propriedades durante a clonagem passando um array associativo para a função clone(). Isso simplifica o padrão “with-er” para classes readonly.

PHP 8.4 e anteriores
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
    {
        $values = get_object_vars($this);
        $values['alpha'] = $alpha;

        return new self(...$values);
    }
}

$blue = new Color(79, 91, 147);
$transparentBlue = $blue->withAlpha(128);
PHP 8.5 NOVO RFC
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,
        ]);
    }
}

$blue = new Color(79, 91, 147);
$transparentBlue = $blue->withAlpha(128);

Atributo #[\NoDiscard]

Ao marcar uma função com #[\NoDiscard], o PHP verificará se o valor retornado foi usado e emitirá um aviso caso não seja. Isso aumenta a segurança de APIs em que o retorno é importante, mas pode ser facilmente ignorado.

O cast (void) pode ser usado para indicar que o valor está sendo descartado intencionalmente.

PHP 8.4 e anteriores
function getPhpVersion(): string
{
    return 'PHP 8.4';
}

getPhpVersion(); // No warning
PHP 8.5 NOVO RFC
#[\NoDiscard]
function getPhpVersion(): string
{
    return 'PHP 8.5';
}

getPhpVersion();
// Warning: The return value of function getPhpVersion() should
// either be used or intentionally ignored by casting it as (void)

Closures e First-Class Callables em Expressões Constantes

Closures estáticas e first-class callables agora podem ser usadas em expressões constantes, incluindo parâmetros de atributos, valores padrão de propriedades e parâmetros, além de constantes.

PHP 8.4 e anteriores
final class PostsController
{
    #[AccessControl(
        new Expression('request.user === post.getAuthor()'),
    )]
    public function update(
        Request $request,
        Post $post,
    ): Response {
        // ...
    }
}
PHP 8.5 NOVO RFC RFC
final class PostsController
{
    #[AccessControl(static function (
        Request $request,
        Post $post,
    ): bool {
        return $request->user === $post->getAuthor();
    })]
    public function update(
        Request $request,
        Post $post,
    ): Response {
        // ...
    }
}

cURL Share Handles Persistentes

Diferente de curl_share_init(), handles criados com curl_share_init_persistent() não são destruídos ao final da requisição PHP. Se um handle persistente com o mesmo conjunto de opções for encontrado, ele será reutilizado, evitando o custo de inicializar o cURL a cada requisição.

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 NOVO RFC RFC
$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);

// This may now reuse the connection from an earlier SAPI request
curl_exec($ch);

Funções array_first() e array_last()

As funções array_first() e array_last() retornam, respectivamente, o primeiro ou o último valor de um array. Se o array estiver vazio, retornam null, o que facilita o uso com o operador ??.

PHP 8.4 e anteriores
$lastEvent = $events === []
    ? null
    : $events[array_key_last($events)];
PHP 8.5 NOVO RFC
$lastEvent = array_last($events);

Recursos e melhorias adicionais

  • Erros fatais (como tempo máximo de execução excedido) agora exibem um backtrace.
  • Atributos agora podem ter como alvo constantes.
  • Atributo #[\Override] agora pode ser aplicado a propriedades.
  • O atributo #[\Deprecated] pode ser usado em traits e constantes.
  • Propriedades estáticas agora suportam visibilidade assimétrica.
  • Propriedades promovidas no construtor podem ser marcadas como final.
  • Adicionado o método Closure::getCurrent() para simplificar recursão em funções anônimas.
  • As funções setcookie() e setrawcookie() agora suportam a chave "partitioned".
  • Novas funções get_error_handler() e get_exception_handler() estão disponíveis.
  • Novos métodos Dom\Element::getElementsByClassName() e Dom\Element::insertAdjacentHTML() estão disponíveis.
  • Nova função grapheme_levenshtein().
  • O novo atributo #[\DelayedTargetValidation] pode ser usado para suprimir erros de compilação de atributos do core e de extensões aplicados a alvos inválidos.

Descontinuações e quebras de compatibilidade

  • O operador backtick como alias de shell_exec() foi descontinuado.
  • Casts não canônicos (boolean), (integer), (double) e (binary) foram descontinuados. Use (bool), (int), (float) e (string).
  • A diretiva INI disable_classes foi removida por quebrar várias garantias internas do engine.
  • Finalizar declarações case com ponto e vírgula, ao invés de dois pontos, foi descontinuado.
  • Usar null como índice de array ou ao chamar array_key_exists() agora é descontinuado. Use string vazia.
  • Não é mais possível usar "array" e "callable" como nomes de alias de classe em class_alias().
  • Os métodos mágicos __sleep() e __wakeup() foram suavemente descontinuados. Use __serialize() e __unserialize().
  • Agora um aviso é emitido ao converter NAN para outros tipos.
  • Desestruturar valores que não sejam arrays (exceto null) usando [] ou list() agora emite um aviso.
  • Agora um aviso é emitido ao converter floats (ou strings que parecem floats) para int quando o valor não pode ser representado como inteiro.
To Top