## Modifications entrainant une incompatibilité ascendante

### Cœur de PHP

#### Interprétation des Labels de Terminaison Heredoc/Nowdoc

Avec l'introduction de la syntaxe flexible heredoc / nowdoc, les chaîne de caractères doc qui contiennent le label de terminaison dans leur corps peuvent causer des erreurs de syntaxe ou changer en interprétation. Par exemple dans :

`<?php
$str = <<<FOO
abcdefg
FOO
FOO;
?>`
l'occurrence indentée de `FOO` n'avait pas de signification particulière précédemment. Désormais elle sera interprétée comme la fin de la chaîne de caractères heredoc et le `FOO;` suivant causera une erreur de syntaxe. Ce problème peut toujours être résolu en choisissant un label de terminaison qui n'apparait pas dans le contenu de la chaîne de caractères.

#### Continue visant Switch génèrent des Avertissements

Les déclarations `continue` visant les structures de flux de contrôle `switch` généreront désormais un avertissement. En PHP ces déclarations `continue` sont équivalentes à `break`, alors qu'elles se comportent comme `continue 2` dans d'autres langages.

`<?php
while ($foo) {
switch ($bar) {
case "baz":
continue;
// Warning: "continue" targeting switch is equivalent to
// "break". Did you mean to use "continue 2"?
}
}
?>`

#### Interprétation Stricte des Clés de Chaînes de Caractères Entiers sur ArrayAccess

Les accès de tableau du type `$obj["123"]`, où `$obj` implémente ArrayAccess et `"123"` est une chaîne de caractères d'entier litérale ne résulteront plus en une conversion implicite en entier, c.à.d., `$obj->offsetGet("123")` sera appellé au lieu de `$obj->offsetGet(123)`. Ceci correspond au comportement pour les non litérales. Le comportement des tableau n'est pas affecté d'une quelconque manière, ils continuent de convertir implicitement des clés de chaîne de caractères en entier.

#### Les Propriétés Statiques ne sont plus séparées par l'Affectation de Référence

En PHP, les propriétés statiques sont partagées entre les classes héritantes, sauf si la propriété statique est explicitement remplacée dans une classe enfant. Cependant à cause d'un artefact d'implémentation il était possible de séparer les propriétés statiques en affectant une référence. Cette lacune a été corrigée.

`<?php
class Test {
public static $x = 0;
}
class Test2 extends Test { }
Test2::$x = &$x;
$x = 1;
var_dump(Test::$x, Test2::$x);
// Previously: int(0), int(1)
// Now: int(1), int(1)
?>`

#### Les références retournées par les tableaux et les accès aux propriétés sont immédiatement décompressées

Les références retournées par les tableaux et les accès aux propriétés sont désormais décompressées dans le cadre de l'accès. Ceci signifie qu'il n'est plus possible de modifier la référence entre l'accès et l'utilisation de la valeur accédée :

`<?php
$arr = [1];
$ref =& $arr[0];
var_dump($arr[0] + ($arr[0] = 2));
// Previously: int(4), Now: int(3)
?>`
Ceci rend le comportement des références et non références cohérent. Il est à noter que lire et écrire une valeur à l'intérieur d'une unique expression continue d'être un comportement non défini et peut changer de nouveau dans le futur.

#### La décompression d'arguments de Traversables avec des clés non-entières n'est plus prise en charge

La décompression d'arguments a cessé de fonctionner avec Traversables avec des clés non-entières Le code suivant fonctionnait en PHP 5.6-7.2 par accident.

`<?php
function foo(...$args) {
var_dump($args);
}
function gen() {
yield 1.23 => 123;
}
foo(...gen());
?>`

#### Divers

L'utilitaire ext_skel a été entièrement repensé avec de nouvelles options et certaines anciennes options supprimées. Ceci est maintenant écrit en PHP et n'a aucune dépendance externe.

Le support pour BeOS a été abandonné.

Les exceptions lancées à cause d'une conversion automatique d'avertissements en exceptions avec le mode `EH_THROW` (par exemple certaines exceptions de DateTime) ne remplissent plus l'état de error_get_last(). En tant que telles, elles fonctionnent désormais de la même manière que les exceptions levées manuellement.

TypeError rapporte désormais les mauvais types en tant que `int` et `bool` au lieu de `integer` et `boolean`, respectivement.

Les variables indéfinies passées à compact() seront désormais rapportées avec une notice.

getimagesize() et les fonctions connexes rapportent désormais le type MIME des images BMP en tant que `image/bmp` au lieu de `image/x-ms-bmp`, car le premier a été inscrit avec l'IANA (voir » RFC 7903).

stream_socket_get_name() retourne désormais les adresses IPv6 avec des crochets. Par exemple `"[::1]:1337"` sera retourné au lieu de `"::1:1337"`.

### BCMath Arbitrary Precision Mathematics

Tous les avertissements lancés par les fonctions BCMath utilisent désormais le gestionnaire d'erreur de PHP. Auparavant certains avertissements étaient écrits directement à stderr.

bcmul() et bcpow() retourne désormais les nombres avec la précision demandée. Auparavant, certains nombres pouvaient omettre les zéros de fin décimaux.

### IMAP, POP3 et NNTP

Les authentifications rsh/ssh sont désactivées par défaut. Utilisez imap.enable_insecure_rsh si vous voulez les activer. Il est à noter que la bibliothèque IMAP ne filtre pas les noms des boîtes aux lettres avant de les passer aux commandes rsh/ssh, ainsi passer des données non fiables à cette fonction avec rsh/ssh activé est dangereux.

### Chaînes de caractères multioctets

En raison de la prise en charge des captures nommées, les masques `mb_ereg_*()` utilisant les captures nommées se comporteront différemment. En particulier les captures nommées feront partie des correspondances et mb_ereg_replace() interprétera la syntaxe additionnelle. Voir Captures Nommées pour plus d'information.

### Extension MySQL Améliorée (MySQLi)

Les déclarations préparées rapportent désormais les fractions de secondes pour les colonnes `DATETIME`, `TIME` et `TIMESTAMP` avec spécificateur décimal (par exemple `TIMESTAMP(6)` lors de l'utilisation de microsecondes). Auparavant les fractions de secondes étaient tout simplement omises des valeurs de retours.

### Fonctions MySQL (PDO_MYSQL)

Les déclarations préparées rapportent désormais les fractions de secondes pour les colonnes `DATETIME`, `TIME` et `TIMESTAMP` avec spécificateur décimal (par exemple `TIMESTAMP(6)` lors de l'utilisation de microsecondes). Auparavant les fractions de secondes étaient tout simplement omises des valeurs de retours. Veuillez noter que ceci affecte uniquement l'utilisation de PDO_MYSQL avec les déclarations préparées émulées désactivées (par exemple en utilisant la fonctionnalité native de préparation). Les déclarations utilisant des connexions qui ont `PDO::ATTR_EMULATE_PREPARES`=`true` (ce qui est par défaut) ne sont pas affectées par la correction de bogue et récupéraient déjà les valeurs des fractions de secondes depuis le moteur.

### Reflection

Les exportations de Reflection en chaîne de caractères utilisent désormais `int` et `bool` au lieu de `integer` et `boolean`, respectivement.

### Bibliothéque Standard de PHP (SPL)

Si un autochargeur SPL lance une exception, les autochargeurs suivants ne seront pas exécutés. Précédemment tous les autochargeurs étaient exécutés et les exceptions étaient chainées.

### SimpleXML

Les opérations mathématiques impliquant les objets SimpleXML traiteront désormais le texte comme un entier ou un nombre décimal, selon ce qui est plus approprié. Auparavant les valeurs étaient traitées comme un entier sans condition.

### Cookies entrants

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