Alterações incompatíveis com versões anteriores

A função number_format() não retorna mais o valor zero negativo

Anteriormente, era possível que a função number_format() retornasse -0. Apesar de isto ser perfeitamente válido de acordo com a especificação de ponto flutuante IEEE 754, esta particularidade não era desejável para mostrar números formatados de uma forma legível.

<?php

var_dump(number_format(-0.01)); // now outputs string(1) "0" instead of string(2) "-0"

Converte chaves numéricas durante conversões de objetos e arrays

Chaves númericas agora são melhor manipuladas ao converter arrays para objetos e objetos para arrays (conversão explícita ou pela função settype()).

Isto siginifica que chaves de números inteiros (ou de strings numéricas) de arrays sendo convertidos para objetos agora são acessíveis:

<?php

// array to object
$arr = [0 => 1];
$obj = (object) $arr;
var_dump(
    $obj,
    $obj->{'0'}, // agora acessível
    $obj->{0} // agora acessível
);

O exemplo acima produzirá:

object(stdClass)#1 (1) {
  ["0"]=>    // agora chave string, ao invés de número inteiro
  int(1)
}
int(1)
int(1)

E chaves de números inteiros (ou de strings numéricas) de objetos sendo convertidos para arrays agora são acessíveis:

<?php

// object to array
$obj = new class {
    public function __construct()
    {
        $this->{0} = 1;
    }
};
$arr = (array) $obj;
var_dump(
    $arr,
    $arr[0], // agora acessível
    $arr['0'] // agora acessível
);

O exemplo acima produzirá:

array(1) {
  [0]=>    // agora chave de número inteiro, ao invés de string
  int(1)
}
int(1)
int(1)

Não é permitido passar null para get_class()

Anteriormente, passar null para a função get_class() mostraria o nome da classe de onde a função foi chamada. Este comportamento agora foi removido, e um alerta E_WARNING será emitido. Para obter o mesmo comportamento anterior, o argumento deve simplesmente ser omitido.

Alerta ao contar tipos não contáveis

Um alerta E_WARNING agora será emitido ao se tentar usar a função count() em tipos não contáveis (isto inclui o apelido sizeof()).

<?php

var_dump(
    count(null), // NULL não é contável
    count(1), // inteiros não são contáveis
    count('abc'), // strings não são contáveis
    count(new stdClass), // objetos que não implementam a interface Countable não são contáveis
    count([1,2]) // arrays são contáveis
);

O exemplo acima produzirá:

Warning: count(): Parameter must be an array or an object that implements Countable in %s on line %d

Warning: count(): Parameter must be an array or an object that implements Countable in %s on line %d

Warning: count(): Parameter must be an array or an object that implements Countable in %s on line %d

Warning: count(): Parameter must be an array or an object that implements Countable in %s on line %d
int(0)
int(1)
int(1)
int(1)
int(2)

ext/hash foi movido de recurso para objeto

Como parte da migração de longo prazo, a extensão Hash foi atualizada para utilizar objetos ao invés de recursos. A alteração deve ser transparente para desenvolvedores PHP, exceto onde houver a função is_resource() (que precisará ser atualizado para is_object()).

Melhoria nos padrões SSL/TLS

As seguinte alterações aos padrões foram feitas:

  • tls:// agora tem os padrões TLSv1.0 ou TLSv1.1 ou TLSv1.2
  • ssl:// é um apelido para tls://
  • Constantes STREAM_CRYPTO_METHOD_TLS_* têm os padrões TLSv1.0 ou TLSv1.1 + TLSv1.2, ao invés de somente TLSv1.0

Valor de retorno de gettype() em recursos fechados

Anteriormente, usar gettype() em um recurso fechado retornaria uma string "unknown type". Agora, uma string "resource (closed)" será retornada.

is_object() e __PHP_Incomplete_Class

Anteriormente, usar is_object() na classe __PHP_Incomplete_Class retornaria false. Agora, true será retornado.

Promoção do nível de erro de constantes indefinidas

Referências não qualificadas a constantes indefinidas agora irão gerar um E_WARNING (ao invés de um E_NOTICE). Não próxima versão maior do PHP, elas irão gerar exceções Error.

Suporte ao Windows

As versões mínimas do Windows oficialmente suportadas são agora Windows 7 e Windows Server 2008 R2.

Verificações nos valores padrões de propriedades de traits

Verificações de compatibilidade em valores padrões de propriedades de traits não irão mais realizar conversões.

object para nomes de classe

O nome object era fracamente reservado no PHP 7.0. Agora é estritamente reservados, e é proibido usá-lo como nome de classe, trait ou interface.

Suporte a NetWare

O suporte a NetWare agora foi removido.

array_unique() com SORT_STRING

Enquanto array_unique() com SORT_STRING anteriormente copiava o array e removia elementos não únicos (sem empactotar o array depois), agora o novo array é construído com a adição dos elementos únicos. Isto pode resultar em índices numéricos diferentes.

Alterações em bcmod() com números do tipo float

A função bcmod() não trunca mais números fracionários para inteiros. Assim sendo, seu comportamento agora segue o da função fmod(), ao invés do operador %. Por exemplo, bcmod('4', '3.5') agora retorna 0.5 ao invés de 1.

Funções de hash e hashes não criptográficos

As funções hash_hmac(), hash_hmac_file(), hash_pbkdf2() e hash_init() (com HASH_HMAC) não aceitam mais hashes não criptográficas.

Opções da função json_decode()

A opção da função json_decode(), JSON_OBJECT_AS_ARRAY, agora é usada se o segundo parâmetro (assoc) for null. Anteriormente, JSON_OBJECT_AS_ARRAY era sempre ignorado.

Saída de rand() e mt_rand()

Sequências geradas por rand() e mt_rand() para uma semente específica podem ser diferentes do PHP 7.1 em máquinas de 64 bits (devido à correção de um problema de polarização de resto de divisão na implementação).

Remoção da condifuração ini sql.safe_mode

A configuração ini sql.safe_mode agora foi removida.

Alterações nas funções date_parse() e date_parse_from_format()

O elemento zone do array retornado pelas funções date_parse() e date_parse_from_format() representa segundos ao invés de minutos agora, e seu sinal está invertido. Por exemplo, -120 é agora 7200.

Cookies Recebidos

A partir do PHP 7.2.34, os nomes de cookies recebidos não são mais decodificados como url por questões de segurança.