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;
?>
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'ils 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ésultera 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és 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 tels, ils 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, certain 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 fiable à 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 Capture 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 example 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 example
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
fonctionalité 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 auto-chargeur SPL lance une exception, les auto-chargeurs suivant ne seront pas exécutés. Précédemment tous les auto-chargeurs é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.