## Modifications entrainant une incompatibilité ascendante

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

Auparavant, un avertissement etait é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();`

L'exemple ci-dessus va afficher quelque chose de 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 class, 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 la possibilité de conserver l'ancienne (et incorrecte) implémentation est possible via la valeur `MT_RAND_PHP` du deuxième paramètre facultatif de mt_srand().

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

rand() et srand() ont maintenant été fait des alias à mt_rand() et mt_srand(), respectivement. Cela signifie que la sortie pour les fonctions suivantes ont des modifications: 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 entier, et seul le premier caractère de la chaîne assignée est utilisé. Autrefois, les chaînes vides était silencieusement traité 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'odonancement 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 invalide pour les classes DateTime ou DatePeriod , ou l'échec de l'initialisation du fuseau horaire à partir de données sérialisées, lèvera désormais une exception Error à partir de la métode __wakeup() ou __set_state(), au lieu de se traduit par une erreur fatale.

Dans l'extension DBA, les fonctions de modification des données (telles que dba_insert()) lèvera 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èvera 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èvera une exception Error au lieu de se traduit 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 parent 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'echec 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èvera 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.

In the SPL extension, attempting to clone an SplDirectory object will now throw an Error exception instead of resulting in a fatal error. Similarly, calling ArrayIterator::append() when iterating over an object will also now throw an Error exception.

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 quel superglobals, $this ou n'importe quel paramètre. Par exemple, toutes ces définitions de fonction entraînera 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 double.

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])));`

L'exemple ci-dessus va afficher quelque chose de 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.