## Modifications entrainant une incompatibilité ascendante

### Exception en passant trop peu d'arguments de fonction

Auparavant, un avertissement était émis pour invoquer des fonctions définies par l'utilisateur avec trop peu d'arguments. Maintenant, cet avertissement a été promu en une exception d'erreur. Cette modification s'applique uniquement aux fonctions définies par l'utilisateur, et non aux fonctions internes. Par exemple:

`<?php
function test($param){}
test();`

Résultat de l'exemple ci-dessus est similaire à :

    Fatal error: Uncaught ArgumentCountError: Too few arguments to function test(), 0 passed in %s on line %d and exactly 1 expected in %s:%d

### Interdire les appels dynamiques aux fonctions d'introspection de portée

Les appels dynamiques pour certaines fonctions ont été interdits (sous la forme de `$func()` ou `array_map('extract', ...)`, etc.). Ces fonctions inspectent ou modifient une autre étendue, et présentent avec eux un comportement ambigu et non fiable. Les fonctions sont les suivantes:

- assert() - avec une chaîne comme premier argument
- compact()
- extract()
- func_get_args()
- func_get_arg()
- func_num_args()
- get_defined_vars()
- mb_parse_str() - avec un argument
- parse_str() - avec un argument

`<?php
(function () {
$func = 'func_num_args';
$func();
})();`

L'exemple ci-dessus va afficher :

    Warning: Cannot call func_num_args() dynamically in %s on line %d

### Nom de classe, interface, et trait invalide

Les noms suivants ne peuvent pas être utilisés pour nommer des classes, des interfaces ou des traits:

- void
- iterable

### Les conversions de chaînes numériques respectent désormais la notation scientifique

Les opérations entières et les conversions sur les chaînes numériques respectent désormais la notation scientifique. Cela inclut également l'opération de cast `(int)` et les fonctions suivantes: intval() (où la base est 10), settype(), decbin(), decoct() et dechex().

### Correctifs à l'algorithme mt_rand()

mt_rand() utilise désormais par défaut la version fixe de l'algorithme Mersenne Twister. Si la sortie déterministe de mt_srand() a été invoquée, alors `MT_RAND_PHP` peut être utilisé comme second paramètre optionnel de mt_srand() pour préserver l'ancienne (et incorrecte) implémentation.

### rand() alias de mt_rand() et srand() alias de mt_srand()

rand() et srand() sont désormais des alias de mt_rand() et mt_srand(), respectivement. Cela signifie que la sortie pour les fonctions suivantes a été modifiée : rand(), shuffle(), str_shuffle() et array_rand().

### Interdire le caractère de contrôle de suppression ASCII dans les identificateurs

Le caractère de contrôle de suppression ASCII (`0X7f`) ne peut plus être utilisé dans les identificateurs qui ne sont pas entre guillemets.

### `error_log` change pour la valeur `syslog`

Si le paramètre INI `error_log` est défini sur `syslog`, les niveaux d'erreur PHP sont mappés aux niveaux d'erreur syslog. Cela apporte une différenciation plus fine dans les journaux d'erreurs contrairement à l'approche précédente où toutes les erreurs sont enregistrées avec le niveau d'avis uniquement.

### N'appelez pas les destructeurs sur des objets incomplets

Les destructeurs ne sont désormais jamais appelés pour les objets qui lèvent une exception pendant l'exécution de leur constructeur. Dans les versions précédentes, ce comportement dépendait de la question de savoir si l'objet était référencé en dehors du constructeur (par exemple par une exception backtrace).

### call_user_func() gestion des arguments de référence

call_user_func() va maintenant toujours générer un avertissement sur les appels aux fonctions qui attendent des références comme arguments. Auparavant, cela dépendait de la question de savoir si l'appel était entièrement qualifié.

En outre, call_user_func() et call_user_func_array() n'abandonneront plus l'appel de fonction dans ce cas. L'avertissement "référence attendue" sera émis, mais l'appel va continuer comme d'habitude.

### L'opérateur d'index vide n'est plus pris en charge pour les chaînes

L'application de l'opérateur d'index vide à une chaîne (par exemple `$str[] = $x`) lève une erreur fatale au lieu de la convertir silencieusement en tableau.

### Affectation via l'accès d'index de chaîne sur une chaîne vide

La modification de chaîne par caractère sur une chaîne vide fonctionne désormais comme pour les chaînes non vides, c'est-à-dire l'écriture dans un décalage hors plage de la chaîne avec des espaces, où les types non entiers sont convertis en entiers, et seul le premier caractère de la chaîne assignée est utilisé. Autrefois, les chaînes vides étaient silencieusement traitées comme un tableau vide.

`<?php
$a = '';
$a[10] = 'foo';
var_dump($a);
?>`

Résultat de l'exemple ci-dessus en PHP 7.0 :

    array(1) {
      [10]=>
      string(3) "foo"
    }

Résultat de l'exemple ci-dessus en PHP 7.1 :

    string(11) "          f"

### Directives ini supprimées

Les directives ini suivantes ont été supprimées :

- `session.entropy_file`
- `session.entropy_length`
- `session.hash_function`
- `session.hash_bits_per_character`

### L'ordonnancement des éléments d'un tableau a changé lorsque qu'ils sont créés automatiquement pendant les affectations par référence

L'ordre des éléments dans un tableau a changé lorsque ces éléments ont été créés automatiquement en les référençant dans une assignation par référence. Par exemple:

`<?php
$array = [];
$array["a"] =& $array["b"];
$array["b"] = 1;
var_dump($array);
?>`

Résultat de l'exemple ci-dessus en PHP 7.0 :

    array(2) {
      ["a"]=>
      &int(1)
      ["b"]=>
      &int(1)
    }

Résultat de l'exemple ci-dessus en PHP 7.1 :

    array(2) {
      ["b"]=>
      &int(1)
      ["a"]=>
      &int(1)
    }

### Ordre de tri des éléments égaux

L'algorithme de tri interne a été amélioré, ce qui peut entraîner un ordre de tri différent des éléments, qui se comparaient comme égaux auparavant.

> Note:

> Ne comptez pas sur l'ordre des éléments qui se comparent comme égaux; il pourrait changer à tout moment.

### Message d'erreur pour les erreurs E_RECOVERABLE

Le message d'erreur pour les erreurs E_RECOVERABLE a été modifié de "Catchable fatal error" à "Recoverable fatal error".

### Paramètre $options de unserialize()

L'élément `allowed_classes` du paramètre $options de unserialize() est maintenant strictement typé, c'est-à-dire que si une valeur autre qu'un tableau ou un booléen est donnée, unserialize() retourne `false` et émet un `E_WARNING`.

### Le constructeur de DateTime incorpore microsecondes

DateTime et DateTimeImmutable intègrent désormais correctement les microsecondes lorsqu'elles sont construites à partir de l'heure actuelle, soit explicitement, soit avec une chaîne relative (par exemple `"first day of next month"`). Cela signifie que les comparaisons naïves de deux instances nouvellement créées seront désormais plus susceptibles de retourner `false` au lieu de `true`:

`<?php
new DateTime() == new DateTime();
?>`

### Conversions des erreurs fatales en exceptions Error

Dans l'extension date, les données de sérialisation invalides pour les classes DateTime ou DatePeriod , ou l'échec de l'initialisation du fuseau horaire à partir de données sérialisées, lèveront désormais une exception Error à partir de la méthode __wakeup() ou __set_state(), au lieu de se traduire par une erreur fatale.

Dans l'extension DBA, les fonctions de modification des données (telles que dba_insert()) lèveront désormais une exception Error au lieu de déclencher une erreur fatale capturable si la clé ne contient pas exactement deux éléments.

Dans l'extension DOM, les contextes de validation de schéma ou de RelaxNG non valides lèveront désormais une exception Error au lieu de résulter en une erreur fatale. De même, la tentative d'inscription d'une classe de nœud qui n'étend pas la classe de base appropriée, ou tente de lire une propriété non valide ou d'écrire dans une propriété en lecture seule, lèvera également une exception Error .

Dans l'extension IMAP, les adresses de messagerie plus longues que 16385 octets lèveront une exception Error au lieu de se traduire par une erreur fatale.

Dans l'extension Intl, le fait de ne pas appeler le constructeur parent dans une classe qui étend Collator avant d'appeler les méthodes parentes lèvera maintenant une Error au lieu d'avoir pour résultat une erreur fatale récupérable. En outre, le clonage d'un objet Transliterator lève désormais une exception Error en cas d'échec du clonage du Transliterator interne au lieu d'une erreur fatale.

Dans l'extension LDAP, la fourniture d'un type de modification inconnu à ldap_batch_modify() lèvera désormais une exception Error au lieu d'une erreur fatale.

Dans l'extension mbstring, les fonctions mb_ereg() et mb_eregi() lèveront désormais une exception ParseError si une expression PHP non valide est fournie et que l'option 'e' est utilisée.

Dans l'extension mcrypt, mcrypt_encrypt() et mcrypt_decrypt() lèveront maintenant une exception Error au lieu d'une erreur fatale si mcrypt ne peut pas être initialisée.

Dans l'extension mysqli, la tentative de lecture d'une propriété non valide ou d'écriture dans une propriété en lecture seule lève maintenant une exception Error au lieu de se traduire par une erreur fatale.

Dans l'extension Reflection, le fait de ne pas récupérer un objet de réflexion ou de récupérer une propriété d'objet lève maintenant une exception Error au lieu de se traduire par une erreur fatale.

Dans l'extension de session, les gestionnaires de session personnalisés qui ne retournent pas de chaînes pour les ID de session lèveront désormais une exception Error au lieu de provoquer une erreur fatale lorsqu'une fonction est appelée pour générer un ID de session.

Dans l'extension SimpleXML, la création d'un attribut sans nom ou dupliqué va maintenant lever une exception Error au lieu de générer une erreur fatale.

Dans l'extension SPL, une tentative de clonage d'un objet SplDirectory va maintenant lever une exception Error au lieu de générer une erreur fatale. De même, appeler ArrayIterator::append() lors de l'itération sur un objet lèvera également une exception Error.

Dans l'extension standard, la fonction assert(), lorsqu'elle est fournie avec un argument de chaîne comme premier paramètre, lèvera maintenant une exception ParseError au lieu d'une erreur fatale capturable si le code PHP n'est pas valide. De même, l'appel à forward_static_call() en dehors d'une étendue de classe lève maintenant une exception Error .

Dans l'extension Tidy, la création manuelle d'un tidyNode lèvera une exception Error au lieu d'une erreur fatale.

Dans l'extension WDDX, une référence circulaire lors de la sérialisation va maintenant lever une exception Error au lieu d'une erreur fatale.

Dans l'extension XML-RPC, une référence circulaire lors de la sérialisation lève maintenant une instance d'exception Error au lieu de se traduire par une erreur fatale.

Dans l'extension Zip, la méthode ZipArchive::addGlob() lève maintenant une exception Error au lieu de se traduire par une erreur fatale si la prise en charge de glob n'est pas disponible.

### Les variables liées lexiquement ne peuvent pas réutiliser les noms

Les variables liées à une fonction anonyme via la construction `use` ne peuvent pas utiliser le même nom que n'importe quelle superglobals, $this ou n'importe quel paramètre. Par exemple, toutes ces définitions de fonction entraîneront une erreur fatale :

`<?php
$f = function () use ($_SERVER) {};
$f = function () use ($this) {};
$f = function ($param) use ($param) {};`

### long2ip() changement de type de paramètre

long2ip() attend maintenant un int à la place de string.

### Encodage et décodage JSON

Le paramètre INI `serialize_precision` contrôle maintenant la précision de sérialisation lors de l'encodage des floats.

Le décodage d'une clé vide entraîne désormais un nom de propriété vide, plutôt que `_empty_` comme nom de propriété.

`<?php
var_dump(json_decode(json_encode(['' => 1])));`

Résultat de l'exemple ci-dessus est similaire à :

    object(stdClass)#1 (1) {
      [""]=>
      int(1)
    }

Lorsque vous fournissez l'indicateur `JSON_UNESCAPED_UNICODE` à json_encode(), les séquences U+2028 et U+2029 sont maintenant échappées.

### Modifications de la sémantique des paramètres de mb_ereg() et mb_eregi()

Le troisième paramètre des fonctions mb_ereg() et mb_eregi() (`regs`) est désormais défini sur un tableau vide si rien n'a été mis en correspondance. Auparavant, le paramètre n'aurait pas été modifié.

### Abandon des flux sslv2

Le flux SSLv2 a maintenant été abandonné dans OpenSSL.

### Interdit "return;" pour les retours typés lors de la compilation

Une déclaration de retour sans arguments dans les fonctions qui déclarent un type de retour émet désormais `E_COMPILE_ERROR` (sauf si le type de retour est déclaré comme void), même si la déclaration de retour ne serait jamais atteinte.