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:
<?php
function test($param){}
test();
Résultat de l'exemple ci-dessus est 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
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:
<?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
Les noms suivants ne peuvent pas être utilisés pour nommer des classes, des interfaces ou des traits:
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().
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.
rand() et srand() sont désormais des alias de mt_rand() et mt_srand(), respectivement. Cela signifie que la sortie pour les fonctions suivantes a été modifiée : rand(), shuffle(), str_shuffle() et array_rand().
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.
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() 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'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.
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.
<?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"
Les directives ini suivantes ont été supprimées :
session.entropy_file
session.entropy_length
session.hash_function
session.hash_bits_per_character
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) }
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.
Le message d'erreur pour les erreurs E_RECOVERABLE a été modifié de "Catchable fatal error" à "Recoverable fatal error".
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
.
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();
?>
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 à 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 :
<?php
$f = function () use ($_SERVER) {};
$f = function () use ($this) {};
$f = function ($param) use ($param) {};
long2ip() attend maintenant un int à la place de string.
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é.
<?php
var_dump(json_decode(json_encode(['' => 1])));
Résultat de l'exemple ci-dessus est 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.
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é.
Le flux SSLv2 a maintenant été abandonné dans OpenSSL.
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.