- 
     
      matchest désormais un mot-clé réservé.
 
- 
     
      mixedest 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=0peut ê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 errcontextne 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. foreachou 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
      keya é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 excluaitE_NOTICEetE_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 à0lorsque@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=Offsoit 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
      explicitenullà 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.
       
- 
        Passer des types compteurs invalides à count()
        entraînera le déclenchement d'une TypeError.
       
 
      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()etT2::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, etT1::funcouT2::funcdoivent ê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, resource 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\Barsera reconnu
      comme un nom à espace de noms,Foo \ Barne 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\xest maintenant la même chose queconstant('new\x'), et pasnew \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 erreurE_WARNING"A
      nonumeric value encountered" et toutes les chaînes qui émettaient une erreurE_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'erreurE_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 uneE_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.