-
match
est désormais un mot-clé réservé.
-
mixed
est désormais un mot réservé, il ne peut donc pas être utilisé pour nommer une classe, une interface ou un trait, et il est également interdit de l'utiliser dans les espaces de noms.
-
Les échecs d'assertion sont maintenant lancés par défaut. Si l'ancien comportement est souhaité,
assert.exception=0
peut être défini dans les paramètres INI.
-
Les méthodes portant le même nom que la classe ne sont plus interprétées comme des constructeurs. La méthode
__construct() doit être utilisée à la place.
-
La possibilité d'appeler des méthodes non statiques de manière statique a été supprimée. Ainsi,
is_callable() échouera lors de la vérification d'une méthode non statique avec un nom de classe
(il faut vérifier avec une instance d'objet).
-
Les castings (real)
et (unset)
ont été supprimés.
-
La directive ini track_errors a été supprimée.
Cela signifie que php_errormsg n'est plus disponible. La fonction
error_get_last() peut être utilisée à la place.
-
La possibilité de définir des constantes insensibles à la casse a été supprimée. Le troisième argument de
define() ne peut plus être true
.
-
La possibilité de spécifier un autochargeur en utilisant une fonction __autoload() a été supprimée.
spl_autoload_register() doit être utilisée à la place.
-
L'argument errcontext
ne sera plus passé aux gestionnaires d'erreurs personnalisés
paramétrés avec set_error_handler().
-
create_function() a été supprimée. Les fonctions anonymes peuvent être utilisées à la place.
-
each() a été supprimée. foreach ou ArrayIterator
doivent être utilisées à la place.
-
La possibilité de délier this des fermetures qui ont été créées à partir d'une méthode,
en utilisant Closure::fromCallable() ou
ReflectionMethod::getClosure() a été supprimée.
-
La possibilité de délier this des fermetures appropriées qui contiennent des utilisations de
this a également été supprimée.
-
La possibilité d'utiliser array_key_exists() avec des objets a été supprimée.
isset() ou property_exists() peuvent être utilisées à la place.
-
Le comportement de array_key_exists() concernant le type du paramètre
key
a été rendu cohérent avec isset() et
l'accès normal aux tableaux. Tous les types de clés utilisent maintenant les coercions habituels et les clés de type tableau/objet lancent une
TypeError.
-
Tout tableau dont la première clé numérique est un nombre n utilisera
n+1 pour sa prochaine clé implicite, même si n est
négatif.
-
Le niveau de signalement des erreurs par défaut (error_reporting) est désormais E_ALL
. Auparavant, il excluait
E_NOTICE
et E_DEPRECATED
.
-
display_startup_errors est désormais activée
par défaut.
-
L'utilisation de parent à l'intérieur d'une classe qui n'a pas de parent entraîne désormais une
erreur fatale à la compilation.
-
L'opérateur @
ne silence plus les erreurs fatales
(E_ERROR
, E_CORE_ERROR
,
E_COMPILE_ERROR
, E_USER_ERROR
,
E_RECOVERABLE_ERROR
, E_PARSE
). Les gestionnaires d'erreurs qui
s'attendent à ce que error_reporting soit égal à 0
lorsque @
est utilisé,
doivent être ajustés pour utiliser une vérification de masque à la place :
<?php
// Remplacer
function my_error_handler($err_no, $err_msg, $filename, $linenum) {
if (error_reporting() == 0) {
return false;
}
// ...
}
// Par
function my_error_handler($err_no, $err_msg, $filename, $linenum) {
if (!(error_reporting() & $err_no)) {
return false;
}
// ...
}
?>
En outre, il faut veiller à ce que les messages d'erreur ne soient pas affichés dans les environnements
de production, ce qui peut entraîner des fuites d'informations. Veillez à ce que l'option
display_errors=Off
soit utilisée en conjonction avec la journalisation des erreurs.
-
#[
n'est plus interprété comme le début d'un commentaire,
car cette syntaxe est désormais utilisée pour les attributs.
-
Les erreurs d'héritage dues à des signatures de méthodes incompatibles (violations de LSP)
génèrent désormais une erreur fatale. Auparavant, un avertissement était généré dans certains cas.
-
La priorité de l'opérateur de concaténation a été modifiée par rapport aux décalages de bits, à l'addition
ainsi qu'à la soustraction.
<?php
echo "Sum: " . $a + $b;
// était auparavant interprété comme:
echo ("Sum: " . $a) + $b;
// est désormais interprété comme:
echo "Sum:" . ($a + $b);
?>
-
Les arguments avec une valeur par défaut qui se résout en null
à l'exécution ne marqueront plus implicitement
le type d'argument comme nullable. Il faut utiliser soit un type explicite nullable, soit une valeur par défaut
explicite null
à la place.
<?php
// Remplacer
function test(int $arg = CONST_RESOLVING_TO_NULL) {}
// Par
function test(?int $arg = CONST_RESOLVING_TO_NULL) {}
// Ou
function test(int $arg = null) {}
?>
-
Un certain nombre d'avertissements ont été convertis en exceptions Error:
-
Tentative d'écriture sur une propriété d'un non-objet. Auparavant, cela
créait implicitement un objet stdClass pour null, false et les chaînes vides.
-
Tentative d'ajout d'un élément à un tableau pour lequel la clé PHP_INT_MAX
est déjà utilisée.
-
Tentative d'utilisation d'un type invalide (tableau ou objet)
comme clé de tableau ou comme index de chaîne de caractères.
- Tentative d'écriture sur un index de tableau d'une valeur scalaire.
- Tentative de décompactage d'un non tableau/Traversable.
-
Tentative d'accès à des constantes non qualifiées qui sont indéfinies.
Auparavant, les accès à des constantes non qualifiées entraînaient un avertissement et étaient interprétés comme des chaînes de caractères.
-
Passer le nombre incorrect d'arguments à une fonction intégrée non variadique
entraînera le déclenchement d'une ArgumentCountError.
Un certain nombre de notices ont été convertis en avertissements :
- Tentative de lecture d'une variable non définie.
- Tentative de lecture d'une propriété non définie.
- Tentative de lecture d'une clé de tableau non définie.
- Tentative de lecture d'une propriété d'un non-objet.
- Tentative d'accès à un index de tableau d'un non-tableau.
- Tentative de conversion d'un tableau en chaîne de caractères.
- Tentative d'utilisation d'une ressource comme clé de tableau.
- Tentative d'utilisation de null, d'un booléen ou d'un nombre flottant comme index de chaîne.
- Tentative de lecture d'un index de chaîne hors limites.
- Tentative d'affectation d'une chaîne vide à un index de chaîne.
-
Tenter d'assigner plusieurs octets à un index de chaîne émettra désormais un avertissement.
-
Les caractères inattendus dans les fichiers source (tels que les octets NUL à l'extérieur des chaînes de caractères) entraîneront désormais
une exception ParseError au lieu d'un avertissement de compilation.
-
Les exceptions non capturée passent maintenant par un "arrêt propre", ce qui signifie que les destructeurs seront appelés
après une exception non capturée.
-
L'erreur fatale à la compilation "Only variables can be passed by reference" a été retardée jusqu'à
l'exécution, et convertie en une exception Error "Argument cannot be passed by reference".
-
Certaines notices "Only variables should be passed by reference" ont été convertis en exception "Argument
cannot be passed by reference".
-
Le nom généré pour les classes anonymes a changé. Il inclura désormais le nom du premier
parent ou interface :
<?php
new class extends ParentClass {};
// -> ParentClass@anonymous
new class implements FirstInterface, SecondInterface {};
// -> FirstInterface@anonymous
new class {};
// -> class@anonymous
?>
Le nom ci-dessus est toujours suivi d'un octet NUL et d'un suffixe unique.
-
Les références de méthodes de traits non absolues dans les adaptations d'alias de traits doivent désormais être
non ambiguës :
<?php
class X {
use T1, T2 {
func as otherFunc;
}
function func() {}
}
?>
Si T1::func()
et T2::func()
existent tous les deux, ce code était auparavant
accepté silencieusement, et func était supposé faire référence à T1::func
. Désormais, il génère une
erreur fatale, et T1::func
ou T2::func
doivent être
écrit explicitement.
-
La signature des méthodes abstraites définies dans les traits est maintenant vérifiée par rapport à la
méthode dans la classe d'implémentation:
<?php
trait MyTrait {
abstract private function neededByTrait(): string;
}
class MyClass {
use MyTrait;
// Error, because of return type mismatch.
private function neededByTrait(): int { return 42; }
}
?>
-
Les fonctions désactivées sont désormais traitées exactement comme des fonctions inexistantes. L'appel d'une fonction
la signalera comme inconnue, et il est désormais possible de redéfinir une fonction désactivée.
-
Les enveloppes de flux data://
ne sont plus inscriptibles, ce qui correspond au comportement
documenté.
-
Les opérateurs arithmétiques et binaires +
, -
,
*
, /
, **
, %
,
<<
, >>
, &
,
|
, ^
, ~
, ++
,
--
lancent désormais systématiquement une TypeError lorsqu'un
des opérandes est un tableau, ressource ou un objet non surchargé. La seule exception à cette règle est
l'opération de fusion de tableau +
, qui reste supportée.
-
La conversion de nombres flottants en chaînes de caractères se fera désormais indépendamment de la localisation.
<?php
setlocale(LC_ALL, "de_DE");
$f = 3.14;
echo $f, "\n";
// Previously: 3,14
// Now: 3.14
?>
Voir printf(), number_format() et
NumberFormatter() pour personnaliser le formatage des nombres.
-
La prise en charge des accolades pour l'accès aux index a été supprimée.
<?php
// Instead of:
$array{0};
$array{"key"};
// Write:
$array[0];
$array["key"];
?>
-
L'application du modificateur final sur une méthode privée produira désormais un avertissement à moins que cette méthode ne soit
le constructeur.
-
Si un constructeur d'objet appelle exit(), le destructeur d'objet n'est plus
appelé. Cela correspond au comportement lorsque le constructeur lance une exception.
-
Les noms d'espace de nommage ne peuvent plus contenir d'espace blanc : Alors que Foo\Bar
sera reconnu
comme un nom à espace de noms, Foo \ Bar
ne le sera pas. Inversement, les mots-clés réservés sont désormais
autorisés en tant que segments d'espace de noms, ce qui peut également modifier l'interprétation du code :
new\x
est maintenant la même chose que constant('new\x')
, et pas
new \x()
.
-
Les ternaires imbriqués nécessitent désormais des parenthèses explicites.
-
debug_backtrace() et Exception::getTrace() ne fourniront plus de
références aux arguments. Il ne sera plus possible de modifier les arguments d'une fonction
par le biais de la trace.
-
La gestion des chaînes numériques a été modifiée pour être plus intuitive et moins sujette aux erreurs. L'espacement
de fin est désormais autorisé dans les chaînes numériques pour des raisons de cohérence avec le traitement des espaces
de tête. Ceci affecte principalement :
- La fonction is_numeric()
- Les comparaisons entre deux chaîne de caractères
- Les déclarations de type
- Les opérations d'incrémentation et de décrémentation
Le concept de "chaînes débutant numériquement" a été pratiquement abandonné ; les cas où il subsiste
existent afin de faciliter la migration. Les chaînes de caractères qui émettaient une erreur E_NOTICE
"A non
wellformed numeric value encountered" émettront désormais une erreur E_WARNING
"A
nonumeric value encountered" et toutes les chaînes qui émettaient une erreur E_WARNING
"A
non-numeric value encountered" émettront désormais une erreur de type
TypeError. Ceci affecte principalement :
- les opérations arithmétiques
- les opérations binaires
Cette modification de E_WARNING
à TypeError affecte également l'erreur
E_WARNING
"Illegal string offset 'string'" pour les index de chaîne illégaux. Le
comportement des transformations explicites en int/float à partir de chaînes de caractères n'a pas été modifié.
-
Les arguments et les types de retour des méthodes magiques seront désormais vérifiés s'ils ont été déclarés.
Les signatures doivent correspondre à la liste suivante :
__call(string $name, array $arguments): mixed
__callStatic(string $name, array $arguments): mixed
__clone(): void
__debugInfo(): ?array
__get(string $name): mixed
__invoke(mixed $arguments): mixed
__isset(string $name): bool
__serialize(): array
__set(string $name, mixed $value): void
__set_state(array $properties): object
__sleep(): array
__unserialize(array $data): void
__unset(string $name): void
__wakeup(): void
-
Les clés des tableaux call_user_func_array() seront désormais interprétées comme des noms de paramètres,
au lieu d'être ignorées silencieusement.
-
La déclaration d'une fonction appelée assert()
à l'intérieur d'un espace de noms
n'est plus autorisée, et émet une E_COMPILE_ERROR
.
La fonction assert() est soumise à un traitement spécial par le moteur,
ce qui peut conduire à un comportement incohérent lors de la définition d'une fonction de l'espace de noms portant le même nom.