## 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 do fluxo. Isso é consistente com a abertura de fluxos.

### 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>` .

#### Calendário

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() codificará por transferência sua string de entrada, enquanto no 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_NOTICE`s 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:

  - assert.active
  - assert.bail
  - assert.callback
  - assert.exception
  - assert.warning
  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.

`↑` and `↓` to navigate • `Enter` to select • `Esc` to close • `/` to open