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.
O teste CLI do FPM agora falha se o caminho do socket for mais longo do que o suportado pelo sistema operacional.
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.
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.
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>
.
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.
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"
.
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.
A assinatura da função imagerotate() foi alterada.
O parâmetro $ignore_transparent
foi removido,
pois era ignorado desde o PHP 5.5.0.
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.
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_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.
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.
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.
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().
O tipo de retorno da função ReflectionClass::getStaticProperties() não é mais nulo.
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.
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
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.
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.
As configurações INI assert.*
foram descontinuadas.
Isso inclui as seguintes configurações INI:
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.
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),
A verificação de erros das flags na função file() agora é cerca de 7% mais rápida.
RecursiveDirectoryIterator agora realiza menos operações de entrada/saída (I/O) ao percorrer um diretório.