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.