Anterioremente, um alerta seria emitido ao chamar funções definidas pelo usuário com parâmetros insuficientes. Agora, este alerta foi promovido a uma exceção da classe Error. Esta alteração aplica-se somente a funções definidas pelo usuário, e não a funções internas. Por exemplo:
<?php
function test($param){}
test();
O exemplo acima produzirá algo semelhante a:
Fatal error: Uncaught ArgumentCountError: Too few arguments to function test(), 0 passed in %s on line %d and exactly 1 expected in %s:%d
Chamadas dinâmicas para certas funções estão proibidas (na forma de $func()
ou array_map('extract', ...)
, etc). Estas funções inspecionam ou modificam outro escopo, e apresentam comportamento ambíguo e não confiável. Estas funções são as seguintes:
<?php
(function () {
$func = 'func_num_args';
$func();
})();
O exemplo acima produzirá:
Warning: Cannot call func_num_args() dynamically in %s on line %d
Os nomes a seguir não podem ser usados para dar nome a classes, interfaces ou traits:
Operacões de números inteiros e conversões de strings numéricas agora respeitam a notação científica. Isto também inclui a operação de conversão (int)
, e as seguintes funções: intval() (onde a base é 10), settype(), decbin(), decoct() e dechex().
mt_rand() agora usa por padrão a versão fixa do algoritmo Mersenne Twister. Se exsite dependência de uma saída determinística de mt_rand(), MT_RAND_PHP
pode ser usada como segundo parâmetro opcional para que mt_srand() preserve a implementação antiga (incorreta).
rand() e srand() agora são apelidos para mt_rand() e mt_srand(), respectivamente. Isto significa que a saída das funções a seguir foi alterada: rand(), shuffle(), str_shuffle() e array_rand().
O caractere de controle 'delete' ASCII (0x7F
) não pode mais ser usado em identificadores que não estejam entre aspas.
error_log
com o valor syslog
Se a configuração ini error_log
for definida para syslog
, os níveis de erro do PHP são mapeados para os níveis de erro dos registros do sistema. Isto traz uma diferenciação mais fina nos registros de erros ao contrário da abordagem anterior onde todos os erros eram registrados somente com o nível de erro de aviso.
Destruidores agora não são mais chamados para objetos que lançam uma exceção durante a execução do seu construtor. Em versões anteriores, este comportamento dependia se o objeto era referenciado fora do construtor (ex.: por um rastreamento de exceção).
call_user_func() agora sempre irá gerar um alerta em chamadas a funções que esperam referências como argumentos. Anteriormente isto dependia se a chamada era totalmente qualificada.
Adicionalmente, call_user_func() e call_user_func_array() não mais irão abortar a chamada à função neste caso. O alerta de "referência esperada" será emitido, mas a chamada irá proceder normalmente.
Aplicar o operador de índice vazio para uma string (ex.: $str[] = $x
) lança um erro fatal ao invés de converter a string silenciosamente para um array.
Modificação de string por caractere em uma string vazia agora funciona como para strings não vazias, isto é, escrever em um deslocamento fora dos limites preenche a string com espaços à esquerda, onde tipos não inteiros são convertidos para inteiros, e apenas o primeiro caractere da string atribuída é usado. Anteriormente, strings vazias eram silenciosamente tratadas como um array vazio.
<?php
$a = '';
$a[10] = 'foo';
var_dump($a);
?>
Saída do exemplo acima no PHP 7.0:
array(1) { [10]=> string(3) "foo" }
Saída do exemplo acima no PHP 7.1:
string(11) " f"
As seguintes diretivas ini foram removidas:
session.entropy_file
session.entropy_length
session.hash_function
session.hash_bits_per_character
A ordem dos elementos em um array foi alterada quando esses elementos tiverem sido criados automaticamente através de uma atribuição por referência. Por exemplo:
<?php
$array = [];
$array["a"] =& $array["b"];
$array["b"] = 1;
var_dump($array);
?>
Saída do exemplo acima no PHP 7.0:
array(2) { ["a"]=> &int(1) ["b"]=> &int(1) }
Saída do exemplo acima no PHP 7.1:
array(2) { ["b"]=> &int(1) ["a"]=> &int(1) }
O algoritmo interno de ordenação foi melhorado, o que pode resultar em uma ordem diferente de elementos, que se comparam como iguais.
Nota:
Não deve-se confiar na ordem dos elementos que se comparam como iguais; ela pode mudar a qualquer momento.
A mensagem de erro para o tipo E_RECOVERABLE foi alterada de "Catchable fatal error" (erro fatal capturável) para "Recoverable fatal error" (erro fatal recuperável).
O elemento allowed_classes
do parâmetro $options da função unserialize() agora é estritamente tipada, isto é, se algo além de um array ou um bool for fornecido, unserialize() retorna false
e emite um E_WARNING
.
DateTime e DateTimeImmutable agora incorportam adequadamente microssegundos quando construídos com o horário atual, tanto explicitamente quanto com uma string relativa (ex.: "first day of next month"
). Isto significa que as comparações nativas de duas novas instâncias criadas agora irão muito provavelmente retornar false
ao invés de true
:
<?php
new DateTime() == new DateTime();
?>
Na extensão Date, dados de serialização inválidos para as classes DateTime ou DatePeriod, ou falha de inicialização de fuso horário a partir de dados serializados, agora irão lançar uma exceção Error pelos métodos __wakeup() ou __set_state(), ao invés de resultar em um erro fatal.
Na extensão DBA, funções de modificação de dados (como dba_insert()) agora irão lançar uma exceção Error ao invés de disparar um erro fatal capturável se a chave não contiver exatamente dois elementos.
Na extensão DOM, esquema inválido ou contextos de validação RelaxNG agora irão lançar uma exceção Error ao invés de resultar em um erro fatal. Da mesma forma, a tentativa de registrar uma classe de nó que não estende a classe base apropriada, ou a tentativa de ler uma propriedade inválida ou de escrever em um propriedade somente-leitura, irão também lançar uma exceção Error.
Na extensão IMAP, endereços de e-mail maiores que 16385 bytes irão lançar uma exceção Error ao invés de resultar em um erro fatal.
Na extensão Intl, a falha ao chamar o construtor pai em uma classe que estende Collator antes de chamar os métodos da classe pai irão lançar uma exceção Error ao invés de resultar em um erro fatal recuperável. Além disso, clonar um objeto Transliterator agora irá lançar uma exceção Error na falha ao clonar o transliterador interno ao invés de resultar em um erro fatal.
Na extesão LDAP, fornecer um tipo de modificação desconhecido a ldap_batch_modify() agora irá lançar uma exceção Error ao invés de resultar em um erro fatal.
Na extensão mbstring, as funções mb_ereg() e mb_eregi() agora irão lançar uma exceção ParseError se uma expressão PHP inválida for fornecida e a opção 'e' for usada.
Na extensão Mcrypt, as funções mcrypt_encrypt() e mcrypt_decrypt() agora irão lançar uma exceção Error ao invés de resultar em um erro fatal se mcrypt não puder ser inicializada.
Na extensão mysqli, a tentativa de se ler uma propriedade inválida ou de escrever em uma propriedade somente-leitura irá agora lançar uma exceção Error ao invés de resultar em um erro fatal.
Na extensão Reflection, falha em receber um objeto de reflexão ou receber uma propriedade de objeto agora irá lançar uma exceção Error ao invés de resultar em um erro fatal.
Na extensão Session, manipuladores de sessão customizados que não retornem strings para IDs de sessão agora irão lançar uma exceção Error ao invés de resultar em um erro fatal quando uma função que deveria gerar um ID de sessão for chamada.
Na extensão SimpleXML, criar um atributo sem nome ou duplicado irá agora lançar uma exceção Error ao invés de resultar em um erro fatal.
Na extensão SPL, tentar clonar um objeto SplDirectory object agora irá lançar uma exceção Error ao invés de resultar em um erro fatal. Da mesma forma, chamar ArrayIterator::append() ao iterar sobre um objeto também irá lançar uma exceção Error.
Na extensão standard, a função assert(), quando alimentada por um argumento string como seu primeiro parâmetro, agora irá lançar uma exceção ParseError ao invés de resultar em um erro fatal recuperável se o código PHP for inválido. Da mesma forma, chamar forward_static_call() for de um escopo de classe agora irá lançar uma exceção Error.
Na extensão Tidy, criar um tidyNode manualmente agora irá lançar uma exceção Error ao invés de resultar em um erro fatal.
Na extensão WDDX, uma referência circular durante seralização agora irá lançar uma exceção Error ao invés de resultar em um erro fatal.
Na extensão XML-RPC, uma referência circular durante seralização agora irá lançar uma instância da exceção Error ao invés de resultar em um erro fatal.
Na extensão Zip, o método ZipArchive::addGlob() agora irá lançar uma exceção Error ao invés de resultar em um erro fatal se o suporte a glob não estiver disponível.
Variáveis vinculadas a uma função anônima através do construtor de linguagem use
não podem usar o mesmo nome de nenhuma das variáveis superglobals, $this, ou de qualquer parâmetro. Por exemplo, todas estas definições de funções irão resultar em um erro fatal:
<?php
$f = function () use ($_SERVER) {};
$f = function () use ($this) {};
$f = function ($param) use ($param) {};
A configuração ini serialize_precision
agora controla a precisão de serialização ao codificar valores do tipo float.
Decodificar uma chave vazia agora resulta em um nome de propriedade vazio, ao invés de _empty_
como nome de propriedade.
<?php
var_dump(json_decode(json_encode(['' => 1])));
O exemplo acima produzirá algo semelhante a:
object(stdClass)#1 (1) { [""]=> int(1) }
A fornecer a opção JSON_UNESCAPED_UNICODE
para json_encode(), as sequências U+2028 e U+2029 agora são escapadas.
O terceiro parâmetro das funções mb_ereg() e mb_eregi() (regs
) agora será definido para um array vazio se nada tiver sido correspondido. Anteriormente, o parâmetro não teria sido modificado.
O fluxo sslv2 agora foi removido do OpenSSL.
Instruções de retorno sem nenhum argumento em funções que declaram um tipo para o retorno agora disparam um erro do tipo E_COMPILE_ERROR
(a menos que o tipo do retorno seja declarado como void), mesmo que a instrução de retorno nunca seja alcançada.