Outras Alterações

Alterações no Núcleo do PHP

Closures

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.

Fibers

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.

Manipuladores de Saída

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.

Alterações em Módulos SAPI

apache2handler

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.

CLI

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.

FPM

A configuração events.mechanism do arquivo /dev/poll para Solaris/Illumos foi aposentada.

Funções Alteradas

Núcleo do PHP

trigger_error() e user_error() agora têm um tipo de retorno true ao invés de bool.

DOM

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

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.

Intl

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

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.

MBString

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.

ODBC

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.

OpenSSL

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.

PDO

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.

PDO_FIREBIRD

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_LEVEL
  • Pdo\Firebird::READ_COMMITTED
  • Pdo\Firebird::REPEATABLE_READ
  • Pdo\Firebird::SERIALIZABLE
  • Pdo\Firebird::WRITABLE_TRANSACTION

Ao 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.

PDO_MYSQL

Agora é possível buscar o valor do atributo PDO::ATTR_FETCH_TABLE_NAMES com o método PDO::getAttribute().

PDO_PGSQL

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.

PGSQL

O parâmetro conditions da função pg_select() agora é opcional e aceita um array vazio.

Phar

Os métodos Phar::setAlias(), Phar::setDefaultStub() agora têm um tipo de retorno provisório de true ao invés de bool.

POSIX

posix_isatty() agora define o número do erro quando o argumento de descritor de arquivo ou fluxo for inválido.

Reflection

O método ReflectionGenerator::getFunction() agora pode ser chamado depois que o gerador termina a execução.

Sockets

O parâmetro backlog da função socket_create_listen() agora tem um valor padrão de SOMAXCONN. Anteriormente, era 128.

Sodium

As funções sodium_crypto_aead_aes256gcm_()* agora estão disponíveis em CPUs aarch64 CPUs com as extensões cripográficas ARM.

SPL

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.

Standard

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.

Arredondando com round()

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.

Outras Alterações em Extensões

cURL

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.

GMP

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.

LibXML

A versão mínima da libxml2 necessária agora é 2.9.4.

Intl

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.

MBString

As tabelas de dados Unicode foram atualizadas para Unicode 16.0.

MySQLnd

Suporte para o novo tipo de dados VECTOR do MySQL 9.

OpenSSL

A versão mínima do OpenSSL necessária agora é 1.1.1.

PDO_PGSQL

A versão mínima da libpq necessária agora é 10.0.

PGSQL

A versão mínima da libpq necessária agora é 10.0.

SPL

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.

XSL

As propriedades tipadas XSLTProcessor::$cloneDocument e XSLTProcessor::$doXInclude agora são declaradas.

Zlib

A versão mínima do zlib necessária agora é 1.2.11.

Desempenho

Núcleo do PHP

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.

BCMath

O desempenho das conversões e operações numéricas foi melhorado.

DOM

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.

FTP

Melhorado o desempenho de uploads de FTP em até um fator de 10x para uploads grandes.

Hash

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.

MBString

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.

MySQLnd

Melhorou o desempenho da cotação do MySQLnd.

PCRE

Melhorado o desempenho de grupos de captura nomeados.

Random

Melhorado o desempenho de Random\Randomizer, com foco específico nos métodos Random\Randomizer::getBytes() e Random\Randomizer::getBytesFromString().

SimpleXML

Melhor desempenho e redução do consumo de memória da serialização XML.

Standard

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.