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:
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:
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:
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.
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.
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:
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
:
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 :
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é.
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.