Outras mudanças

Mudanças no Core

FFI

FFI::load() agora é permitido durante o carregamento antecipado quando opcache.preload_user é o usuário do sistema atual. Anteriormente, chamar FFI::load() não era possível durante o carregamento antecipado se a diretiva opcache.preload_user estivesse definida.

FPM

O teste CLI do FPM agora falha se o caminho do socket for mais longo do que o suportado pelo sistema operacional.

Opcache

Nas SAPIs CLI e phpdbg, o carregamento antecipado não exige mais que a diretiva opcache.preload_user esteja configurada ao ser executado como root. Nas outras SAPIs, essa diretiva é necessária ao ser executado como root, pois o carregamento antecipado é feito antes da SAPI mudar para um usuário não privilegiado.

Streams

A função fread() de bloqueio em uma conexão de socket agora retorna imediatamente se houver dados em buffer, em vez de esperar por mais dados.

Uma memória de fluxo não falha mais se o deslocamento de busca estiver além do final. Em vez disso, a memória é aumentada na próxima gravação e os dados entre o antigo final e o deslocamento são preenchidos com bytes zero, da mesma forma como acontece com arquivos.

Operações de acesso ao stat() como file_exists() e similares agora usarão o caminho real em vez do caminho real da stream. Isso é consistente com a abertura de streams.

Alterações nos Módulos SAPI

CLI

Os fluxos STDOUT, STDERR e STDIN não são mais fechados na destruição de resources, o que ocorre principalmente quando o CLI termina. No entanto, ainda é possível fechar explicitamente esses fluxos usando fclose() e funções semelhantes.

Funções Alteradas

Core

gc_status() adicionou os seguintes 8 campos:

  • "running" => bool
  • "protected" => bool
  • "full" => bool
  • "buffer_size" => int
  • "application_time" => float: Tempo total de aplicação, em segundos (incluindo collector_time)
  • "collector_time" => float: Tempo gasto coletando ciclos, em segundos (incluindo destructor_time e free_time)
  • "destructor_time" => float: Tempo gasto executando destrutores durante a coleta de ciclos, em segundos
  • "free_time" => float: Tempo gasto liberando valores durante a coleta de ciclos, em segundos.

class_alias()agora suporta a criação de um alias de uma classe interna.

Definir open_basedir em tempo de execução usando ini_set('open_basedir', ...); não aceita mais caminhos que contenham o diretório pai (..). Anteriormente, apenas os caminhos que começavam com .. eram proibidos. Isso poderia ser facilmente contornado adicionando ./ ao início do caminho.

Os manipuladores de exceção do usuário agora capturam exceções durante a finalização.

O HTML resultante das funções highlight_string() e highlight_file() foi alterado. O espaço em branco entre as tags HTML externas é removido. As quebras de linha e espaços não são mais convertidos em entidades HTML. Todo o HTML agora é envolvido em uma tag <pre>. A tag <span> externa foi mesclada com a tag <code> .

Calendar

A função easter_date() agora suporta anos de 1970 a 2.000.000.000 em sistemas de 64 bits, anteriormente, ela suportava apenas anos no intervalo de 1970 a 2037.

Curl

A função curl_getinfo() agora suporta duas novas constantes: CURLINFO_CAPATH e CURLINFO_CAINFO. Se a opção for null, duas chaves adicionais são adicionadas: "capath" e "cainfo".

DOM

Alterada a tentativa de tipo de retorno de DOMCharacterData::appendData() para true.

DOMDocument::loadHTML(), DOMDocument::loadHTMLFile() e DOMDocument::loadXML() agora têm um tipo de retorno tentativo de bool. Anteriormente, isso estava documentado com um tipo de retorno de DOMDocument|bool, mas, a partir do PHP 8.0.0, DOMDocument não pode mais ser retornado, pois não pode ser chamado estaticamente.

Gd

A assinatura da função imagerotate() foi alterada. O parâmetro $ignore_transparent foi removido, pois era ignorado desde o PHP 5.5.0.

Intl

A função datefmt_set_timezone() (e seu alias IntlDateformatter::setTimeZone()) agora retorna true em caso de sucesso, anteriormente retornava null.

IntlBreakiterator::setText() agora retorna false em caso de falha, anteriormente era retornado null. Agora retorna true em caso de sucesso, anteriormente era retornado null.

IntlChar::enumCharNames() agora retorna um boolean. Anteriormente, ela retornava null em caso de sucesso e false em caso de falha.

O método IntlDateFormatter::construct() lançará uma exceção U_ILLEGAL_ARGUMENT_ERROR quando uma localidade inválida foi definida.

MBString

As funções mb_strtolower() e mb_convert_case() implementam regras de formatação condicional para a letra sigma grega. Para mb_convert_case(), a formatação condicional se aplica apenas aos modos MB_CASE_LOWER e MB_CASE_TITLE, não aos modos MB_CASE_LOWER_SIMPLE e MB_CASE_TITLE_SIMPLE..

A função mb_decode_mimeheader() interpreta os underscores em palavras MIME codificadas com QPrint conforme o RFC 2047; eles são convertidos em espaços. Os underscores devem ser codificados como "=5F" em tais palavras MIME codificadas.

Em casos raros, mb_encode_mimeheader() pode transferir-encode (codificar para transferência) a cadeia de entrada, enquanto em PHP 8.2 ela seria passada como ASCII bruto.

A função mb_encode_mimeheader() não descarta mais os bytes NUL (zero) ao codificar a string de entrada com QPrint. Isso anteriormente causava a corrupção de strings em determinadas codificações de texto, especialmente UTF-16 e UTF-32, ao usar mb_encode_mimeheader.

O modo "não estrito" da função mb_detect_encoding()'s agora se comporta conforme descrito na documentação. Anteriormente, retornava false se o mesmo byte (por exemplo, o primeiro byte) da string de entrada fosse inválido em todas as codificações candidatas. Mas geralmente, eliminava codificações candidatas da consideração quando um byte inválido era encontrado e, se o mesmo byte de entrada eliminasse todas as codificações restantes ainda em consideração, retornaria false. Por outro lado, se todas as codificações candidatas, exceto uma, fossem eliminadas da consideração, retornaria a última restante sem considerar quantos erros de codificação poderiam ser encontrados posteriormente na string. Isso difere do comportamento descrito na documentação, que diz: "Se estrito for definido como falso, a codificação mais próxima será retornada."

mysqli

mysqli_fetch_object() agora gera um ValueError em vez de uma Exception quando o argumento $constructor_args não está vazio e a classe não possui um construtor.

mysqli_poll() agora gera um ValueError quando nenhum dos argumentos $read nem $error é fornecido.

mysqli_field_seek() e mysqli_result::field_seek() agora especificam o tipo de retorno como true em vez de bool.

ODBC

A função odbc_autocommit() agora aceita null como valor para o parâmetro $enable. Passar null tem o mesmo comportamento que passar apenas 1 parâmetro, ou seja, indica se o recurso de autocommit está habilitado ou não.

PGSQL

pg_fetch_object() agora gera um ValueError em vez de uma Exception quando o argumento $constructor_args não está vazio e a classe não possui um construtor.

A função pg_insert() agora gera um ValueError em vez de um E_WARNING quando a tabela especificada é inválida.

As funções pg_insert() e pg_convert() agora geram um ValueError ou TypeError em vez de um E_WARNING quando o valor/tipo de um campo não corresponde adequadamente ao tipo do PostgreSQL.

O parâmetro $row das funções pg_fetch_result(), pg_field_prtlen(), e pg_field_is_null() agora é opcional.

Random

A função mt_srand() e srand() foram alteradas para não verificarem o número de argumentos para determinar se uma semente (seed) aleatória deve ser usada. Passar null gerará uma semente aleatória, e ao passar 0, será usado zero como a semente. As funções agora são consistentes com com o comportamento de Random\Engine\Mt19937::__construct().

Reflection

O tipo de retorno da função ReflectionClass::getStaticProperties() não é mais nulo.

Standard

As mensagens de erro do tipo E_NOTICEs emitidas pela função unserialize() foram elevadas para E_WARNING.

unserialize() agora emite um novo E_WARNING se a entrada contiver bytes não consumidos.

array_pad() agora está limitada apenas pelo número máximo de elementos que um array pode ter. Anteriormente, era possível adicionar no máximo 1048576 elementos de cada vez.

strtok() gera um E_WARNING no caso em que o token não é fornecido ao iniciar a tokenização.

A função password_hash() agora encadeará a exceção subjacente Random\RandomException como a Exception $previous do tipo ValueError's quando a geração de salt falhar.

Se você estiver usando um array como o parâmetro $command proc_open(), ele agora deve ter pelo menos um elemento não vazio. Caso contrário, um ValueError será lançado.

proc_open() retorna false se o array $command for inválido, em vez de um objeto do tipo resource que produz um aviso posteriormente. Este já era o comportamento no Windows mas agora também é aplicável se uma implementação posix_spawn estiver em uso (maioria das plataformas Linux, BSD e MacOS). Ainda existem algumas plataformas antigas onde este comportamento não foi alterado já que posix_spawn não é suportado nelas.

array_sum() e array_product() agora emitem um aviso quando os valores no array não podem ser convertidos para int ou float. Anteriormente, arrays e objetos eram ignorados, enquanto todos os outros valores eram convertidos para int. Além disso, objetos que definem uma conversão numérica (por exemplo, GMP) agora são convertidos em vez de serem ignorados.

O parâmetro $decimals da função number_format() agora lida corretamente com números inteiros negativos. Arredondar com um valor negativo para $decimals significa que $num é arredondado para $decimals dígitos significativos antes do ponto decimal. Anteriormente, valores negativos para $decimals eram silenciosamente ignorados e o número era arredondado para zero casas decimais.

Um novo argumento $before_needle foi adicionado à função strrchr(). Ele se comporta de forma semelhante ao seu equivalente nas funções strstr() ou stristr().

str_getcsv() e fgetcsv() agora retornam uma string vazia em vez de uma string contendo um único byte nulo para o último campo, que contém apenas um encapsulamento não terminado.

Outras Alterações nas Extensões

Core

O uso dos operadores de incremento/decremento (++/--) em valores do tipo bool agora gera avisos. Isso ocorre porque atualmente não tem efeito, mas se comportará como $bool += 1 no futuro.

O uso do operador de decremento (--) em valores do tipo null agora gera avisos. Isso ocorre porque atualmente não tem efeito, mas se comportará como $null -= 1 no futuro.

Objetos internos que implementam um cast _IS_NUMBER, mas não um manipulador do operador que sobrescreve a adição e a subtração, agora podem ser incrementados e decrementados como se alguém fosse fazer $o += 1 ou $o -= 1

DOM

O mecanismo de vida útil do DOM foi reformulado de tal forma que nós implicitamente removidos ainda podem ser recuperados. Anteriormente, isso resultava em uma exceção.

SQLite3

A classe SQLite3 agora lança SQLite3Exception (que estende Exception) em vez de Exception.

O código de erro do SQLite agora é passado no código de erro da exceção, em vez de ser incluído na mensagem de erro.

Mudanças no Tratamento de Arquivos INI

  • As configurações INI assert.* foram descontinuadas. Isso inclui as seguintes configurações INI:

    Se o valor da configuração for igual ao valor padrão, nenhuma notificação de descontinuação será emitida. Em vez disso, a configuração INI zzend.assertions deve ser usada.
  • zend.max_allowed_stack_size é uma nova diretiva INI que define o tamanho máximo permitido da pilha. Os valores possíveis são 0 (detectar o tamanho máximo da pilha do processo ou da thread), -1 (sem limite) ou um número positivo de bytes. O valor padrão é 0. Quando não é possível detectar o tamanho máximo da pilha do processo ou da thread, é usado um valor padrão do sistema conhecido. Definir esse valor muito alto tem o mesmo efeito que desabilitar o limite de tamanho da pilha. Fibers usam fiber.stack_size como tamanho máximo permitido da pilha. Um Error é gerado quando a pilha de chamadas do processo ultrapassa zend.max_allowed_stack_size-zend.reserved_stack_size bytes, para evitar falhas de segmentação induzidas por estouro de pilha, com o objetivo de facilitar a depuração. O tamanho da pilha aumenta durante recursões não controladas envolvendo funções internas ou os métodos mágicos __toString(), __clone(), __sleep(), __destruct(). Isso não está relacionado a estouros de buffer de pilha e não é uma medida de segurança.

  • zend.reserved_stack_size é uma nova diretiva INI que define o tamanho reservado da pilha, em bytes. Esse valor é subtraído do tamanho máximo permitido da pilha, como um buffer, ao verificar o tamanho da pilha.

Performance

DOM

A iteração sobre um DOMNodeList agora utiliza o cache. Portanto, solicitar itens não leva mais tempo quadrático por padrão.

Obter o conteúdo de texto de nós agora evita uma alocação, resultando em um ganho de desempenho.

DOMChildNode::remove()agora possui desempenho O(1),

Standard

A verificação de erros das flags na função file() agora é cerca de 7% mais rápida.

SPL

RecursiveDirectoryIterator agora realiza menos operações de entrada/saída (I/O) ao percorrer um diretório.