Os nomes de closures foram ajustados para incluir o nome da função-mãe e a linha de suas definições para tornar mais fácil distingui-las, por exemplo, dentro de rastreamentos de pilha.
Troca de Fiber durante a execução do destrutor não é permitida. Foi bloqueada anteriormente devido a conflitos com a coleta de lixo.
Destrutores agora podem ser executados em uma Fiber separada:
Quando a coleta de lixo é acionada em uma Fiber, os destrutores chamados pelo coletor de lixo são executados em uma fibra separada: o gc_destructor_fiber. Se esta Fiber for suspensa, uma nova será criada para executar os destrutores restantes. O gc_destructor_fiber anterior não é mais referenciado pelo coletor de lixo e pode ser coletado se não for referenciado em nenhum outro lugar. Objetos cujos destrutores estão suspensos não serão coletados até que o destrutor retorne ou a Fiber seja coletada.
    As opções de status do manipulador de saída passadas no parâmetro flags
    da função ob_start() agora são limpas.
   
    output_add_rewrite_var() agora usa
    url_rewriter.hosts
    ao invés de
    session.trans_sid_hosts
    para selecionar hosts que serão sobrescritos.
   
Suporte para o Apache versões 2.0 e 2.2 foi removido (fim de vida dessas versões). A versão mínima requerida para o Apache é agora a 2.4.
O servidor interno procura um arquivo de índice recursivamente, percorrendo os diretórios pais caso o arquivo especificado não possa ser localizado. Este processo era ignorado anteriormente se o caminho parecesse se referir a um arquivo, ou seja, se o último componente do caminho contivesse um ponto. Nesse caso, um erro 404 era retornado. O comportamento foi alterado para procurar um arquivo de índice em todos os casos.
Descarregar cabeçalhos sem um corpo agora será uma operação bem sucedida.
A página de status tem um novo campo para exibir um pico de uso de memória.
    
    A configuração events.mechanism do arquivo /dev/poll
    para Solaris/Illumos foi descontinuada.
   
trigger_error() e user_error() agora têm um tipo de retorno true ao invés de bool.
    DOMDocument::registerNodeClass()
    agora tem um tipo provisório de retorno de true ao invés de
    bool.
    O método retornaria somente true na prática.
   
    hash_update()
    agora tem um tipo provisório de retorno de true ao invés de
    bool.
    O método retornaria somente true na prática.
   
    NumberFormatter::ROUND_TOWARD_ZERO e
    NumberFormatter::ROUND_AWAY_FROM_ZERO
    foram adicionadas como sinônimos para
    NumberFormatter::ROUND_DOWN e
    NumberFormatter::ROUND_UP
    para ficarem consistentes com os novos modos
    PHP_ROUND_*.
   
    ResourceBundle::get()
    
    agora tem um tipo de retorno provisório de ResourceBundle|array|string|int|null.
   
    As funções idn_to_ascii() e idn_to_utf8()
    agora sempre lançam ValueErrors
    se o nome em domain estiver vazio ou for muito longo.
   
    As funções idn_to_ascii() e idn_to_utf8()
    agora sempre lançam ValueError
    se o parâmetro variant não for
    INTL_IDNA_VARIANT_UTS46.
   
libxml_set_streams_context() agora imediatamente lança um TypeError quando um recurso que não seja de contexto de fluxo é passado para a função, ao invés de lançar mais tarde quando o contexto de fluxo for usado.
O comportamento de mb_strcut() é mais consistente agora em relação a strings UTF-8 e UTF-16 inválidas. Não há alteração de comportamento para strings UTF-8 e UTF-16 válidas.
    O parâmetro row das funções
    odbc_fetch_object(),
    odbc_fetch_array() e
    odbc_fetch_into() agora tem o valor padrão de null,
    consistente com odbc_fetch_row().
    Anteriormente, os valores padrão eram
    -1,
    -1
    e 0,
    respectivamente.
   
    O parâmetro extra_attributes da função
    openssl_csr_new() agora define os atributos CSR
    ao invés do DN, antes era feito incorretamente.
   
    O parâmetro dn na função
    openssl_csr_new() permite definir um array
    de valores para uma única entrada.
   
    Novo parâmetro serial_hex adicionado à função
    openssl_csr_sign() para permitir a definição de números seriais
    em formato hexadecimal.
   
    Analisar um horário UTC ASN.1 com openssl_x509_parse()
    falha se os segundos forem omitidos para versões do OpenSSL menores que 3.2
    (-1 é retornado para esses campos).
    As versões do OpenSSL maiores que 3.3 já não carregam esses certificados.
   
    Agora é possível buscar o valor do atributo
    PDO::ATTR_STRINGIFY_FETCHES com o método
    PDO::getAttribute().
   
    Uma nova constante PDO::PGSQL_ATTR_RESULT_MEMORY_SIZE
    foi adicionada para recuperar o uso de memória de resultados de consultas com o método
    PDO::getAttribute() para drivers que suportam isso.
   
    Agora é possível buscar o valor dos atributos
    
    FB_ATTR_DATE_FORMAT,
    FB_ATTR_TIME_FORMAT e
    FB_ATTR_TIMESTAMP_FORMAT
    com o método
    
    PDO::getAttribute().
   
Adicionados novos atributos para especificar o nível de isolamento da transação e o modo de acesso. Foram adicionadas cinco constantes relacionadas a esta funcionalidade:
Pdo\Firebird::TRANSACTION_ISOLATION_LEVELPdo\Firebird::READ_COMMITTEDPdo\Firebird::REPEATABLE_READPdo\Firebird::SERIALIZABLEPdo\Firebird::WRITABLE_TRANSACTIONAo usar conexões persistentes, agora há uma verificação de atividade no construtor.
    O conteúdo criado muda dependendo do valor de
    FB_API_VER em
    ibase.h.
    Um novo método estático Pdo\Firebird::getApiVersion()
    pode ser usado para obter esta informação.
    Esta informação agora também é referenciada em phpinfo().
   
    Cinco novos tipos de dados estão agora disponíveis:
    INT128, DEC16, DEC34, TIMESTAMP_TZ, TIME_TZ
    .
    Eles estão disponíveis a partir do Firebird 4.0.
   
    Agora é possível buscar o valor do atributo
    PDO::ATTR_FETCH_TABLE_NAMES com o método
    
    PDO::getAttribute().
   
    Adicionado suporte à recuperação de uso de memória de consultas com
    PDO::PGSQL_ATTR_RESULT_MEMORY_SIZE.
   
    Se a coluna for do tipo FLOAT4OID ou
    FLOAT8OID, o valor agora será retornado como um
    float ao invés de string.
   
    O parâmetro conditions da função
    pg_select() agora é opcional e aceita um array vazio.
   
Os métodos Phar::setAlias(), Phar::setDefaultStub() agora têm um tipo de retorno provisório de true ao invés de bool.
posix_isatty() agora define o número do erro quando o argumento de descritor de arquivo ou fluxo for inválido.
O método ReflectionGenerator::getFunction() agora pode ser chamado depois que o gerador termina a execução.
    O parâmetro backlog da função
    socket_create_listen() agora tem um valor padrão de
    SOMAXCONN.
    Anteriormente, era 128.
   
As funções sodium_crypto_aead_aes256gcm_()* agora estão disponíveis em CPUs aarch64 CPUs com as extensões criptográficas ARM.
Os métodos SplPriorityQueue::insert(), SplPriorityQueue::recoverFromCorruption(), SplHeap::insert(), SplHeap::recoverFromCorruption() agora têm um tipo de retorno provisório de true ao invés de bool.
A classe SplObjectStorage agora implementa a interface SeekableIterator.
    O valor padrão 'cost' para o algoritmo de hash PASSWORD_BCRYPT
    da função password_hash() aumentou de
    10 para 12.
    
   
A função debug_zval_dump() agora indica se um array está empacotado.
    long2ip() agora tem um tipo de retorno string
    
    ao invés de string|false.
   
    
    highlight_string() agora tem um tipo de retorno
    string|true ao invés de string|bool.
   
    
    print_r() agora tem um tipo de retorno
    string|true ao invés de string|bool.
   
     O parâmetro mode da
     função round() foi ampliado para
     
     RoundingMode|int,
     
     aceitando instâncias de uma nova enumeração RoundingMode.
     
    
Quatro novos modos foram adicionados à função round(): RoundingMode::PositiveInfinity, RoundingMode::NegativeInfinity, RoundingMode::TowardsZero, RoundingMode::AwayFromZero
     A implementação interna para arredondamento para números inteiros foi reescrita
     para ser mais fácil de verificar a precisão e para ser mais fácil de manter.
     Alguns problemas de arredondamento foram corrigidos como resultado da reescrita.
     Por exemplo, arredondar anteriormente 0.49999999999999994
     para o número inteiro mais próximo resultaria em 1.0
     ao invés do resultado correto 0.0.
     Entradas adicionais também podem ser afetadas e resultar em resultados diferentes
     em comparação com versões anteriores do PHP.
    
     Foi corrigido um problema causado pelo "pré-arredondamento" da função round().
     Anteriormente, era usado um "pré-arredondamento" para tratar um valor como 0.285
     (na verdade 0.28499999999999998) como um número decimal
     e arredondá-lo para 0.29.
     No entanto, o "pré-arredondamento" arredonda incorretamente determinados números,
     portanto, essa correção remove o "pré-arredondamento" e altera a forma como os números são comparados,
     para que os valores sejam arredondados corretamente como números decimais.
    
     A precisão máxima que pode ser tratada por round()
     foi estendida em um dígito.
     Por exemplo, round(4503599627370495.5) retornava
     4503599627370495.5,
     mas agora retorna 4503599627370496.
    
A versão mínima do libcurl necessária agora é 7.61.0.
    A opção CURLOPT_DNS_USE_GLOBAL_CACHE não tem mais
    efeito e é ignorada silenciosamente.
    Este recurso subjacente foi descontinuado na libcurl 7.11.1
    e removido na libcurl 7.62.0.
   
    Converter um objeto GMP para bool agora é
    possível em vez de emitir um E_RECOVERABLE_ERROR.
    O comportamento de conversão é sobrecarregado de modo que um objeto GMP
    representando o valor 0 seja convertido em false.
   
A versão mínima da libxml2 necessária agora é 2.9.4.
O comportamento da classe Intl foi normalizado para sempre lançar exceções Error ao tentar usar um objeto não inicializado ou quando a clonagem falhar.
As tabelas de dados Unicode foram atualizadas para Unicode 16.0.
Suporte para o novo tipo de dados VECTOR do MySQL 9.
A versão mínima do OpenSSL necessária agora é 1.1.1.
A versão mínima da libpq necessária agora é 10.0.
A versão mínima da libpq necessária agora é 10.0.
Acessos fora dos limites em SplFixedArray agora lançam exceções do tipo OutOfBoundsException em vez de RuntimeException. Como OutOfBoundsException é uma classe filha de RuntimeException nenhuma mudança comportamental é exibida ao tentar capturar essas exceções.
As propriedades tipadas XSLTProcessor::$cloneDocument e XSLTProcessor::$doXInclude agora são declaradas.
A versão mínima do zlib necessária agora é 1.2.11.
Foi melhorado o desempenho da análise e formatação de números de ponto flutuante em compilações ZTS sob cargas altamente simultâneas. Isso afeta a família de funções printf(), bem como funções de serialização, como json_encode() ou serialize().
    sprintf() usando apenas os especificadores %s
    e %d serão compilados na interpolação de
    string equivalente, evitando a sobrecarga de uma chamada de função e
    a análise repetitiva da string de formato.
   
O desempenho das conversões e operações numéricas foi melhorado.
O desempenho de DOMNode::C14N() foi bastante melhorado para o caso sem uma consulta xpath. Isso pode proporcionar uma melhoria de tempo de facilmente duas ordens de magnitude para documentos com dezenas de milhares de nós.
Melhoria no desempenho e redução do consumo de memória da serialização XML.
Uso reduzido de memória de classes de nós.
Melhorado o desempenho de uploads de FTP em até um fator de 10x para uploads grandes.
Adicionadas implementações SSE2 e SHA-NI do SHA-256. Isso melhora o desempenho em CPUs suportadas em aproximadamente 1,3x (SSE2) e 3x - 5x (SHA-NI). Créditos para Colin Percival / Tarsnap por esta otimização.
mb_strcut() é muito mais rápida agora para strings UTF-8 e UTF-16.
Pesquisar nomes de codificação mbstring é muito mais rápido agora.
O desempenho da conversão de SJIS-win em Unicode foi bastante melhorado.
Melhorou o desempenho da cotação do MySQLnd.
Melhorado o desempenho de grupos de captura nomeados.
Melhorado o desempenho de Random\Randomizer, com foco específico nos métodos Random\Randomizer::getBytes() e Random\Randomizer::getBytesFromString().
Melhor desempenho e redução do consumo de memória da serialização XML.
O desempenho de strspn() e strcspn() foi bastante melhorado. Elas agora são executadas em tempo linear em vez de serem limitadas por tempo quadrático.
Melhorado o desempenho de strpbrk().
get_browser() é muito mais rápido agora, até 1.5x - 2.5x para alguns casos de testes.
