## Évolutions incompatibles avec les versions précédentes

### Empêcher number_format() de retourner zéro négatif

Auparavant, il était possible pour la fonction number_format() retourne `-0`. Bien que cela soit parfaitement valide conformément à la norme "IEEE 754 floating point spécification", cette bizarrerie n'était pas souhaitable pour l’affichage des nombres mis en forme sous une forme lisible par l'homme.

`<?php
var_dump(number_format(-0.01)); // maintenant affiche string(1) "0" à la place de string(2) "-0"`

### Conversion des clés numériques dans les objets et tableaux lors de cast

Les clé numériques sont maintenant mieux appréhendées lors de cast d'un tableau en objet et d'un objet en tableau (cast explicite ou par la fonction settype()).

Cela signifie que les clés représentées par un entier (ou un entier sous forme de texte) d'un tableau casté en objet sont désormais accessibles :

`<?php
// tableau vers un objet
$arr = [0 => 1];
$obj = (object) $arr;
var_dump(
$obj,
$obj->{'0'}, // désormais accessible
$obj->{0} // désormais accessible
);`

L'exemple ci-dessus va afficher :

    object(stdClass)#1 (1) {
      ["0"]=>    // désormais clé texte plutôt qu'une clé entière
      int(1)
    }
    int(1)
    int(1)

Et les clés au format entier (ou entier sous forme de texte) des objets convertis en tableaux sont désormais accessibles :

`<?php
// objet vers tableau
$obj = new class {
public function __construct()
{
$this->{0} = 1;
}
};
$arr = (array) $obj;
var_dump(
$arr,
$arr[0], // désormais accessible
$arr['0'] // désormais accessible
);`

L'exemple ci-dessus va afficher :

    array(1) {
      [0]=>    // désormais clé entière plutôt qu'une clé texte
      int(1)
    }
    int(1)
    int(1)

### Interdire de passer `null` à get_class()

Auparavant, passer `null` à la fonction get_class() retournait le nom de la classe en cours. Ce comportement a été supprimé, une erreur `E_WARNING` est affichée à la place. Pour retrouver le même comportement qu'avant, l’argument devrait simplement être supprimé.

### Avertir lors du comptage de types non dénombrables

Un `E_WARNING` sera émis lors de la tentative d'utilisation de la fonction count() sur un type non dénombrable (cela inclut la fonction alias sizeof()).

`<?php
var_dump(
count(null), // NULL is not countable
count(1), // un entier n'est pas dénombrable
count('abc'), // une chaîne n'est pas dénombrable
count(new stdClass), // un objet qui n'implémente pas l'interface Countable n'est pas dénombrable
count([1,2]) // un tableau est dénombrable
);`

L'exemple ci-dessus va afficher :

    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)

### Remplacement ext/hash de ressources en objets

Dans le cadre de la migration à long terme des ressources, l’extension Hash a été mise à jour pour utiliser les objets au lieu de ressources. Le changement devrait être transparent pour les développeurs PHP, à l’exception où des vérifications avec is_resource() ont été faites (il sera nécessaire de remplacer par is_object()).

### Améliorer les valeurs par défaut SSL/TLS

Les modifications suivantes concernant les valeurs par défaut ont été apportées :

- `tls://` maintenant par défaut TLSv1.0 ou TLSv1.1 ou TLSv1.2
- `ssl://` est un alias de `tls://`
- `STREAM_CRYPTO_METHOD_TLS_*` constantes par défaut de TLSv1.0 ou TLSv1.1 + TLSv1.2, à la place de TLSv1.0 uniquement.

### gettype() valeur de retour sur les ressources fermées

Auparavant, l'utilisation de gettype() sur une ressource fermée retournait une chaîne `"unknown type"`. Maintenant, la chaîne `"resource (closed)"` sera retournée.

### is_object() et __PHP_Incomplete_Class

Auparavant, l'utilisation de is_object() sur la classe __PHP_Incomplete_Class retournait `false`. Maintenant, `true` sera retourné.

### Augmentation du niveau d'erreur des constantes non définies

Les références non qualifiées aux constantes non définies généreront désormais une `E_WARNING` (à la place d'une `E_NOTICE`). Dans la prochaine version majeure de PHP, elles généreront une exception Error.

### Prise en charge de Windows

Les versions minimales officiellement supportées pour Windows sont Windows 7/ Server 2008 R2.

### Vérification des valeurs par défaut des propriétés des traits

Les contrôles de compatibilité sur les valeurs par défaut des propriétés de trait n'effectueront plus la conversion.

### `object` pour les noms de classes

Le nom `object` était précédement soft-réservé en PHP 7.0. Il est maintenant réservé, interdisant son utilisation comme nom de classe, de trait ou d'interface.

### Prise en charge de NetWare

La prise en charge de NetWare a maintenant été supprimée.

### array_unique() avec `SORT_STRING`

Alors que array_unique() avec `SORT_STRING` copiait anciennement le tableau et supprimait des éléments non uniques (sans emballer le tableau par la suite), maintenant un nouveau tableau est construit en ajoutant les éléments uniques. Cela peut entraîner des index numériques différents.

### bcmod() change pour des nombres décimaux

La fonction bcmod() ne tronque plus les nombres fractionnaires en entiers. En tant que tel, son comportement suit maintenant fmod(), plutôt que l'opérateur `%`. Par exemple `bcmod('4', '3.5')` retourne maintenant `0.5` à la place de `1`.

### Fonctions de hachage et hachages non cryptographiques

Les fonctions hash_hmac(), hash_hmac_file(), hash_pbkdf2(), et hash_init() (avec `HASH_HMAC`) n'acceptent plus les hachages non cryptographiques.

### Options de la fonction json_decode()

L'option `JSON_OBJECT_AS_ARRAY` de la fonction json_decode() est maintenant utilisée si le second paramètre (assoc) est `null`. Précédemment `JSON_OBJECT_AS_ARRAY` a toujours été ignoré.

### Sortie de rand() et mt_rand()

Les séquences générées par rand() et mt_rand() pour des cas spécifiques peuvent différer de PHP 7.1 sur les machines 64 bits (en raison de la correction d'un bug dans l'implémentation de la polarisation du modulo).

### Suppression du paramètre INI `sql.safe_mode`

Le paramètre INI `sql.safe_mode` a maintenant été supprimé.

### Changement dans date_parse() et date_parse_from_format()

L'élément de `zone` du tableau retourné par date_parse() et date_parse_from_format() représente des secondes au lieu des minutes, et son signe est inversé. Par exemple `-120` est maintenant `7200`.

### Incoming Cookies

Depuis PHP 7.2.34, les noms des cookies entrants ne sont plus url-décodés pour des raisons de sécurité.