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;
?>
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.
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"?
}
}
?>
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.
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 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)
?>
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());
?>
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"
.
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.
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.
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.
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.
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.
Les exportations de Reflection en
chaîne de caractères utilisent désormais
int
et bool
au lieu de
integer
et boolean
, respectivement.
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.
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.
Depuis PHP 7.3.23, les noms des cookies entrants ne sont plus url-décodés pour des raisons de sécurité.