## Alterações Incompatíveis com Versões Anteriores

### Núcleo do PHP

#### Sinônimos `"array"` e `"callable"`

Não é mais possível usar `"array"` e `"callable"` como sinônimos de nomes de classe em class_alias().

#### Comparação livre de objetos incomparáveis

A comparação livre de objetos incomparáveis (por exemplo, enumerações, CurlHandle e outras classes internas) com booleanos era inconsistente anteriormente. Se comparado a um booleano literal `$object == true`, se comportaria da mesma forma que `(bool)$object`. Se comparado a um valor estaticamente desconhecido `$object == $true`, sempre retornaria `false`. Este comportamento foi consolidado para sempre seguir o de `(bool)$object`.

#### Valor de retorno de gc_collect_cycles()

O valor de retorno de gc_collect_cycles() não mais inclui strings e recursos que foram indiretamente coletados através dos ciclos.

#### Substituição da palavra-chave 'static' em subclasses finais

Agora é permitido substituir static por self ou pelo nome concreto da classe em subclasses finais.

#### Manipuladores de tiques

Os manipuladores de tiques agora são desativados após todas as funções de desligamento e destrutores terem sido executadas e os manipuladores de saída terem sido limpos.

#### Vinculação de Traits

Traits agora são vinculados antes da classe superior. Esta é uma alteração comportamental sutil mas deve corresponder de forma mais precisa às expectativas do usuário.

#### Erros durante a compilação e à vinculação de classes

Os erros emitidos durante a compilação e a vinculação de classes agora são sempre atrasados e tratados após a compilação ou a vinculação de classes. Erros fatais emitidos durante a compilação ou a vinculação de classes fazem com que quaisquer erros atrasados ​​sejam tratados imediatamente, sem chamar manipuladores de erros definidos pelo usuário.

#### Exceções lançadas pelo manipulador de erros definido pelo usuário

Exceções lançadas por manipuladores de erros definidos pelo usuário ao lidar com a vinculação de classes Erros não são mais promovidos a erros fatais e não impedem a vinculação.

#### Erro de aplicação de atributo durante a compilação

Aplicar `#[\Attribute]` a uma classe abstrata, enumeração, interface ou trait gera um erro durante a compilação. Anteriormente, o atributo podia ser adicionado, mas quando ReflectionAttribute::newInstance() era chamado, um erro era lançado. O erro pode ser adiado da compilação para o momento de execução usando o novo atributo `#[\DelayedTargetValidation]`.

#### Configuração INI disable_classes

A configuração INI disable_classes foi removida porque faz com que várias premissas do mecanismo sejam quebradas.

#### Desconstruindo valores não-array

Desconstruir valores não-array (diferentes de `null`) usando `[]` ou list() agora emite um alerta.

#### Avisos relacionados à conversão

Agora, um aviso é emitido ao converter floats (ou strings que se parecem com floats) para inteiros se eles não puderem ser representados como um. Isso afeta conversões explícitas implícitas para inteiro.

Agora, um aviso é emitido ao converter NAN para outros tipos.

### Bzip2

bzcompress() agora lança um ValueError quando `$block_size` não estiver entre 1 e 9.

bzcompress() agora lança um ValueError quando `$work_factor` não estiver entre 0 e 250.

### DOM

Clonar um DOMNamedNodeMap, DOMNodeList, Dom\NamedNodeMap, Dom\NodeList, Dom\HTMLCollection, e Dom\DtdNamedNodeMap agora falha. Isto nunca realmente resultou em um objeto funcional, portanto nenhum impacto é esperado.

### FileInfo

finfo_file() e finfo::file() agora lançam um ValueError em vez de um TypeError quando `$filename` contiver bytes NUL. Isso alinha o tipo de erro lançado para ser consistente com o restante da linguagem.

### Intl

A extensão agora requer pelo menos a ICU 57.1.

IntlDateFormatter::setTimeZone()/datefmt_set_timezone() agora lança um IntlException nas falhas de classes ou clones sem inicialização.

Todos os métodos de Locale agora lançam um ValueError quando o argumento de localidade contiver bytes NUL.

O comportamento de `Collator::SORT_REGULAR` em relação à manipulação de strings numéricas agora é alinhado com o comportamento de `SORT_REGULAR` na extensão padrão.

### LDAP

ldap_get_option() e ldap_set_option() agora lançam um ValueError quando uma opção inválida é passada.

### MBString

As tabelas de dados do Unicode foram atualizadas para Unicode 17.0.

### MySQLi

Chamar o construtor mysqli em um objeto já construído não é mais possível e lança um Error.

### ODBC

O ODBC agora pressupõe que pelo menos a funcionalidade ODBC 3.5 esteja disponível. A definição ODBCVER e os sinalizadores do sistema de compilação para controlá-la foram removidos.

O ODBC não possui mais opções de compilação para compilar com drivers específicos (exceto para DB2) e remove casos especiais para esses drivers. É altamente recomendado o uso de um gerenciador de drivers como o iODBC ou o unixODBC em sistemas não Windows.

### Opcache

A extensão Opcache agora está sempre integrada ao binário do PHP e está sempre carregada. As diretivas INI opcache.enable e opcache.enable_cli ainda são respeitadas.

As opções de configuração --enable-opcache/--disable-opcache foram removidas e a compilação não produz mais os objetos opcache.so ou php_opcache.dll.

O uso de diretivas INI `zend_extension=opcache.so` ou `zend_extension=php_opcache.dll` emitirá um aviso.

### PCNTL

pcntl_exec() agora lança um ValueError quando as entradas do parâmetro `$args` contiver bytes NUL.

pcntl_exec() agora lança um ValueError quando as entradas ou chaves do parâmetro `$env_vars` contiver bytes NUL.

### PCRE

A extensão foi compilada sem a opção de compilação semi-obsoleta PCRE2_EXTRA_ALLOW_LOOKAROUND_BSK.

### PDO

Os argumentos do construtor definidos em conjunto com `PDO::FETCH_CLASS` agora seguem a semântica usual do CUFA (call_user_func_array()). Isso significa que as chaves de string se comportarão como um argumento nomeado. Além disso, o encapsulamento automático para argumentos por valor passados ​​para um parâmetro por referência foi removido, e o aviso usual `E_WARNING` sobre isso agora é emitido. Para passar uma variável por referência para um argumento do construtor, use a atribuição geral de referência de valor de array: `$ctor_args = [&$valByRef]`.

Tentar chamar PDOStatement::setFetchMode() durante uma chamada para PDOStatement::fetch(), PDOStatement::fetchObject(), PDOStatement::fetchAll(), por exemplo, usando truques como passar o objeto de instrução como um argumento do construtor ao buscar em um objeto, agora lançará um Error.

Os valores das constantes `PDO::FETCH_GROUP`, `PDO::FETCH_UNIQUE`, `PDO::FETCH_CLASSTYPE`, `PDO::FETCH_PROPS_LATE` e `PDO::FETCH_SERIALIZE` foram alterados.

Agora, uma exceção ValueError é lançada se `PDO::FETCH_PROPS_LATE` for usado com um modo de busca diferente de `PDO::FETCH_CLASS`, consistente com outras opções de busca.

Agora, uma exceção ValueError é lançada se `PDO::FETCH_INTO` for usada como modo de busca em PDOStatement::fetchAll(), similar a `PDO::FETCH_LAZY`.

### PDO_FIREBIRD

Agora, um ValueError é lançado ao tentar definir um cursor com um nome muito longo em um PDOStatement resultante do driver Firebird.

### PDO_SQLITE

O SQLite PDO::quote() agora lançará uma exceção ou emitirá um aviso, dependendo do modo de erro, se a string contiver um byte nulo.

PDO::sqliteCreateCollation() agora lançará uma exceção se a função de retorno tiver o tipo de retorno errado, tornando-o mais alinhado com o comportamento de Pdo\Sqlite::createCollation().

### POSIX

posix_kill() agora lança um ValueError quando o argumento process_id é menor ou maior do que o suportado pela plataforma (intervalo de inteiro com sinal ou de longo), posix_setpgid() agora lança um ValueError quando o process_id ou o process_group_id é menor que zero ou maior do que o suportado pela plataforma.

posix_setrlimit() agora lança um ValueError quando os argumentos hard_limit ou soft_limit forem menores que -1 ou se soft_limit for maior que hard_limit.

### Reflection

ReflectionAttribute::newInstance() agora pode lançar erros para atributos internos se o atributo foi aplicado em um alvo inválido e o erro foi atrasado do tempo de compilação para o tempo de execução por meio do atributo #[\DelayedTargetValidation].

### Session

A tentativa de gravar dados de sessão onde $_SESSION tem uma chave contendo o caractere pipe (`|`) agora emitirá um aviso em vez de falhar silenciosamente.

session_start() é mais rigorosa em relação ao argumento 'options'. Agora, ela lança um ValueError se o array não for um hashmap, ou um TypeError se o valor read_and_close não for um tipo válido compatível com int.

Passar um inteiro `0` como o argumento `locales` para a função setlocale() não é mais suportado e agora lança um TypeError.

### SimpleXML

Passar uma expressão XPath que retorna algo diferente de um conjunto de nós para SimpleXMLElement::xpath() agora emitirá um aviso e retornará `false`, em vez de falhar silenciosamente e retornar um array vazio.

### SNMP

snmpget(), snmpset(), snmp2_get(), snmp2_set(), snmp3_get(), snmp3_set() e SNMP::__construct() lançam um ValueError quando o nome do host é muito grande, contém algum byte nulo ou se a porta fornecida for negativa ou maior que 65535, os valores de tempo limite e tentativas são menores que -1 ou muito grandes.

### SOAP

SoapClient::__doRequest() agora aceita um novo parâmetro opcional `$uriParserClass` que aceita argumentos de string ou `null`. `null` representa o método original baseado em (parse_url()), enquanto os novos backends serão usados ​​ao passar Uri\Rfc3986\Uri ou Uri\WhatWg\Url.

### Sockets

socket_create_listen(), socket_bind() e socket_sendto() agora lançam um ValueError se a porta for menor que 0 ou maior que 65535, e também se alguma das entradas da matriz hints for indexada numericamente.

socket_addrinfo_lookup() agora lança um TypeError se algum dos valores de dicas não puder ser convertido para inteiro e pode lançar um ValueError se algum desses valores estourar.

socket_set_option() com as opções `MCAST_LEAVE_GROUP`/`MCAST_LEAVE_SOURCE_GROUP` agora lança uma exceção se o valor não for um objeto ou um array válido.

socket_set_option() com contexto multicast agora lança um ValueError quando o socket criado não é da família `AF_INET`/`AF_INET6`.

### SPL

ArrayObject não aceita mais enumerações, pois modificar as propriedades $name ou $value pode quebrar as premissas do mecanismo.

O parâmetro de SplFileObject::fwrite() `$length` agora aceita valores nulos. O valor padrão foi alterado de `0` para `null`.

### Standard

O uso de uma função da família printf com um formatador que não especificava a precisão anteriormente redefinia incorretamente a precisão em vez de tratá-la como uma precisão de 0.

### Tidy

tidy::__construct(), tidy::parseFile(), tidy::parseString() agora lançam um ValueError se a configuração contiver um valor inválido ou tentar definir uma entrada interna somente leitura, e um TypeError se uma chave de configuração não for uma string.

`↑` and `↓` to navigate • `Enter` to select • `Esc` to close • `/` to open