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.