Alterações incompatíveis com versões anteriores

PHP Core

Programas que estavam muito próximos de estourar a pilha de chamadas.

Programas que estavam muito próximos de esgotar a pilha de chamadas agora podem lançar um Error ao usar mais do que !-- link linkend="zend.max_allowed_stack_size-zend.reserved_stack_size" -->zend.max_allowed_stack_size-zend.reserved_stack_size bytes de pilha (fiber.stack_size-zend.reserved_stack_size para fibers).

Executando proc_get_status() várias vezes

Executar proc_get_status() várias vezes agora sempre retornará o valor correto em sistemas POSIX. Anteriormente, apenas a primeira chamada da função retornava o valor correto. Executar proc_close() após proc_get_status() agora também retornará o código de saída correto. Anteriormente, isso retornaria -1. Internamente, isso funciona armazenando em cache o resultado em sistemas POSIX. Se for necessário o comportamento anterior, é possível verificar a chave "cached" no array retornado por proc_get_status() para verificar se o resultado foi armazenado em cache.

Temporizadores Máximos de Execução do Zend

Os Temporizadores Máximos de Execução do Zend agora estão habilitados por padrão para compilações ZTS no Linux.

Usos de traits com propriedades estáticas

O uso de traits com propriedades estáticas agora irá redeclarar as propriedades estáticas herdadas da classe pai. Isso criará um armazenamento de propriedade estática separado para a classe atual. Isso é análogo a adicionar a propriedade estática diretamente à classe sem o uso de traits.

Atribuir um índice negativo a um array vazio

Atribuir um índice negativo $n a um array vazio agora garantirá que o próximo índice seja $n+1, em vez de 0.

Verificação de consistência na visibilidade de constantes de classe

A variação na visibilidade de constantes de classe agora é verificada corretamente quando herdada de interfaces.

Entradas WeakMap cuja chave mapeia para si mesma

As entradas WeakMap cuja chave mapeia para si mesma (possivelmente de forma transitiva) agora podem ser removidas durante a coleta de ciclos se a chave não for alcançável, exceto por meio da iteração sobre o WeakMap (a alcançabilidade por iteração é considerada fraca). Anteriormente, tais entradas nunca seriam removidas automaticamente.

Date

A extensão DateTime introduziu exceções e erros específicos da extensão Date sob as hierarquias DateError e DateException, em vez de avisos e exceções genéricas. Isso melhora o tratamento de erros, embora exija que se verifiquem erros e exceções.

DOM

Chamar DOMChildNode::after(), DOMChildNode::before(), DOMChildNode::replaceWith() em um nó que não tem pai agora não faz nada (no-op) em vez de gerar uma exceção de hierarquia, conforme exigido pela especificação DOM.

Usar os métodos DOMParentNode e DOMChildNode sem um documento agora funciona em vez de lançar uma exceção DOM_HIERARCHY_REQUEST_ERR DOMException. Isso está de acordo com o comportamento exigido pela especificação DOM.

Chamar DOMDocument::createAttributeNS() sem especificar um prefixo criaria incorretamente um namespace padrão, colocando o elemento dentro do namespace em vez do atributo. Esse erro foi corrigido.

Anteriormente, DOMDocument::createAttributeNS() lançaria incorretamente uma exceção DOM_NAMESPACE_ERRNAMESPACE_ERR DOMException quando o prefixo já estivesse sendo usado para outro URI. Agora, ele escolhe corretamente um prefixo diferente quando há conflito de nomes de prefixo.

Foram adicionados novos métodos e propriedades a algumas classes DOM. Se uma classe definida pelo usuário herda dessas classes e declara um método ou propriedade com o mesmo nome, as declarações devem ser compatíveis. Caso contrário, ocorrerá um erro de compilação típico relacionado a declarações incompatíveis. Consulte a lista de novas funcionalidades e novas funções para obter uma lista dos métodos e propriedades recém-implementados.

FFI

As funções C que têm um tipo de retorno void agora retornam null em vez de retornar o seguinte objeto object(FFI\CData:void) { }.

Opcache

A diretiva INI opcache.consistency_checks foi removida. Essa funcionalidade estava quebrada com o tracing JIT, bem como com o inheritance cache, e foi desativada sem a possibilidade de ser habilitada desde o PHP 8.1.18 e o PHP 8.2.5. Tanto o tracing JIT quanto o inheritance cache podem modificar a memória compartilhada (shm) depois que o script foi persistido, invalidando seu checksum. A tentativa de correção ignorou os ponteiros modificáveis, mas foi rejeitada devido à complexidade. Por esse motivo, foi decidido remover a funcionalidade em vez de mantê-la.

Phar

O tipo das constantes de classe da classe Phar agora está declarado.

Standard

A função range() sofreu várias mudanças:

  • Agora é lançado um TypeError ao passar objects, resources ou arrays como entradas de limite.
  • Agora é lançado um ValueError mais descritivo ao passar 0 para $step.
  • Agora é lançado um ValueError ao usar um $step negativo para intervalos crescentes.
  • Se $step for um número em ponto flutuante que pode ser interpretado como um número inteiro, ele agora será tratado como tal.
  • Agora, um ValueError é lançado se qualquer argumento for infinito ou NAN.
  • Agora, é gerado um E_WARNING se $start ou $end for uma string vazia. O valor ainda é convertido para o valor 0.
  • Agora, é gerado um E_WARNING se $start ou $end tiver mais de um byte, desde que seja uma string não numérica.
  • Agora, é gerado um E_WARNING se $start ou $end for convertido para um inteiro porque a outra entrada de limite é um número (por exemplo, range(5, 'z');).
  • Agora, é gerado um E_WARNING se $step for um número em ponto flutuante ao tentar gerar um intervalo de caracteres, exceto se ambas as entradas de limite forem strings numéricas (por exemplo, range('5', '9', 0.5); não gera um aviso).
  • range() agora gera uma lista de caracteres se uma das entradas de limite for um dígito em forma de string, em vez de converter a outra entrada para um número inteiro (por exemplo, range('9', 'A');).
<?php
range('9', 'A'); // ["9", ":", ";", "<", "=", ">", "?", "@", "A"], a partir do PHP 8.3.0
range('9', 'A'); // [9, 8, 7, 6, 5, 4, 3, 2, 1, 0], antes do PHP 8.3.0
?>

number_format() agora lida com valores negativos de $decimals arredondando $num para abs($decimals) dígitos antes do separador decimal. Anteriormente, valores negativos de $decimals eram ignorados.

A verificação de erros das flags da função file() agora identifica todas as flags inválidas. Notavelmente, FILE_APPEND era anteriormente aceito silenciosamente.

SNMP

O tipo das constantes de classe da classe SNMP agora está declarado.