"array" e "callable"
Não é mais possível usar "array"
e "callable" como sinônimos de nomes de classe
em class_alias().
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.
O valor de retorno de gc_collect_cycles() não mais inclui strings e recursos que foram indiretamente coletados através dos ciclos.
Agora é permitido substituir static por self ou pelo nome concreto da classe em subclasses finais.
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.
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.
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 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.
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].
A configuração INI disable_classes foi removida porque faz com que várias premissas do mecanismo sejam quebradas.
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.
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.
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.
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_get_option() e ldap_set_option() agora lançam um ValueError quando uma opção inválida é passada.
As tabelas de dados do Unicode foram atualizadas para Unicode 17.0.
Chamar o construtor mysqli em um objeto já construído não é mais possível e lança um Error.
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.
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_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.
A extensão foi compilada sem a opção de compilação semi-obsoleta PCRE2_EXTRA_ALLOW_LOOKAROUND_BSK.
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 PDO::fetch(), PDO::fetchObject(), PDO::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
PDO::fetchAll(),
similar a PDO::FETCH_LAZY.
Agora, um ValueError é lançado ao tentar definir um cursor com um nome muito longo em um PDOStatement resultante do driver Firebird.
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_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.
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].
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 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.
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.
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.
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.
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.
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::__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.