PHP 8.2 : quelles nouveautés ?

5 min
128
0
0
Publié le

PHP 8.2, la nouvelle version de l’incontournable langage de programmation web sera disponible d’ici la fin de l’année 2022. Cette release devrait notamment améliorer la sécurité et les performances de ce langage souvent critiqué pour sa lenteur et son modèle d’exécution. Pourtant, malgré ces critiques PHP reste utilisé par plus de 80 % des sites web dont ceux conçus avec le célèbre CMS WordPress. Alors, quelles sont les nouvelles fonctionnalités prévues dans la version 8.2 ? Quels impacts sur les sites et applications codés en PHP ? Découvrez toutes les nouveautés prévues dans PHP 8.2

Plus de performances et de sécurité avec PHP 8.2

Une fonction pour réinitialiser l’utilisation de la mémoire dans PHP 8.2

La prochaine version de PHP devrait comporter une nouvelle fonction baptisée « memory_reset_peak_usage() ». Comme son nom le laisse penser, elle permettra de remettre à zéro l’utilisation maximale de la mémoire. Cette fonctionnalité est particulièrement utile dans les applications qui appellent ou itèrent sur des actions et doivent enregistrer ou contrôler l’état de la mémoire avant chaque invocation. Elle viendra donc généralement en complément de la fonction préexistante memory_get_peak_usage() qui retourne sous forme de int (octets) la quantité de mémoire maximale allouée à un script PHP.

Exemples d’utilisation de la fonction : 

$chaîne = str_repeat (« p », 1024 * 1024 * 4);
memory_get_peak_usage (); //renvoie 4590752
 
unset ($chaîne);
 
$chaîne = str_repeat (« p », 1024 * 1024 * 3);
memory_get_peak_usage (); //renvoie toujours 4590752

L’extrait de code ci-dessus va créer une variable $chaîne contenant la lettre « p » répétée 4194304 fois. L’utilisation de memory_get_peak_usage() révèle que l’utilisation maximale de la mémoire allouée à ce script est de 4590752 octets. 

Ensuite, la variable est détruite et réécrite avec une répétition plus petite que la précédente. Pourtant, l’utilisation maximale de la mémoire reste la même…

Avec la nouvelle fonction memory_reset_peak_usage(), cette utilisation maximale peut être réduite à tout moment :

$chaîne = str_repeat (« p », 1024 * 1024 * 4);
memory_get_peak_usage(); //renvoie 4590752
 
unset ($chaîne);
 memory_reset_peak_usage();
 
$chaîne = str_repeat (« p », 1024 * 1024 * 3);
memory_get_peak_usage(); //renvoie 3542648

Un attribut pour supprimer des valeurs de paramètres sensibles du stack

La stack ou pile est souvent « suivie » en programmation et en particulier dans les phases de débogage afin de tracer les différentes fonctions et méthodes appelées.

Les « traces » de la pile peuvent être affichées grâce aux fonctions intégrées et préexistantes de debug_backtrace() et debug_print_backtrace().

Les traces de piles comportent de nombreuses informations sur :

  • le fonctionnement de l’application ;

  • les structures de fichiers ;

  • les données ;

  • les paramètres passés en entrée aux fonctions.

Ces traces peuvent donc constituer d’importants problèmes de sécurité en révélant, en clair, des informations sensibles. Pour améliorer la sécurité de PHP, la version 8.2 intègre un attribut nommé SensitiveParameter, qui permet de marquer les paramètres sensibles afin de les supprimer de la trace de la pile.

Exemple d’utilisation de l’attribut :

Sans l’attribut SensitiveParameter, une erreur fatale sur la fonction password_hash() pourrait révéler le mot de passe en clair dans les messages et journaux d’erreurs :

password_hash($ VarContenantMotDePasse, « algo-de-hachage-inconnu »);

La trace de la pile révélera :

Fatal error: Uncaught ValueError: password_hash(): Argument #2 ($algo) must be a valid password hashing algorithm in ...:...
Stack trace:
#0 ....php(4): password_hash (motdepasseenclair, « algo-de-hachage-inconnu »)
#1 {main}
  thrown in ... on line …

Avec l’attribut, l’appel à la fonction devient :

function passwordHash(#[SensitiveParameter] string $ password): string {
   debug_print_backtrace();}

La trace de la pile affichée ne contient plus le mot de passe en clair. Sa valeur ci est remplacé par SensitiveParameterValue :

array (1) {
 [0]=>
 array (4) {
   [« file »]=> string (38) « … »
   ["line"]=> int(9)
   ["function"]=> string(3) "foo"
   ["args"]=> array(1) {
     [0]=> object (SensitiveParameterValue) # 1 (0) {
     }
   }
 }
}

Les dépréciations prévues dans la nouvelle version de PHP

Les propriétés dynamiques sont dépréciées avec PHP 8.2 

Jusqu’à la version 8.2, des propriétés de classe PHP non déclarées peuvent être définies et récupérées dynamiquement grâce aux méthodes get() et set().

Ces propriétés dynamiques offrent une grande flexibilité mais elles peuvent aussi entraîner des bugs et comportements inattendus dans les applications. Désormais, dans la version PHP 8.2, la définition d’une valeur sur une propriété de classe non préalablement déclarée affiche un message d’avertissement.

Exemple :

class Utilisateur {
    private int $identifiant;
}
 
$utilisateur = new Utilisateur();
$utilisateur->name = « John »;

Avant PHP 8.2, ce code ne génèrera aucun avertissement. Avec la version 8.2 un message d’obsolescence s’affiche :

Deprecated: Creation of dynamic property User::$name is deprecated in ... on line ...

Dans la version 9.0, l’utilisation de propriétés dynamiques entraînera une erreur fatale. 

Pour garantir dans un premier temps une rétrocompatibilité, PHP 8.2 intègre un nouvel attribut dans le namespace global : #[AllowDynamicProperties]. Les objets dont les classes sont déclarées avec cet attribut n’entraînent pas d’avertissement de dépréciation s’ils comportent des propriétés dynamiques.

Par exemple, le code suivant ne générera aucun message d’avertissement :

#[AllowDynamicProperties]
class Utilisateur {
    private int $identifiant;
}
 
$utilisateur = new Utilisateur ();
$utilisateur->name = « John »;

Certains encodages de mbstring deviennent obsolètes

L’extension mbstring fournit des fonctions de manipulation de chaînes pour travailler avec des encodages multioctets en PHP. Pour cela, elle gère la traduction entre plusieurs jeux de caractères notamment l’unicode et d’autres jeux mono-octets. Ces fonctions sont particulièrement utilisées pour manipuler des caractères spéciaux (emoji, caractères asiatiques, etc.) qui ne peuvent pas être encodés sur un seul octet.

Mais, avec la version 8.2 de PHP, certains encodages vont disparaître de mbstring. Il s’agit de :

  • BASE64 ;

  • UUENCODE ;

  • HTML-ENTITIES (et son alias HTML) ;

  • Quoted-Printable (et son alias qprint).

L’utilisation de mbstring pour ces encodages de caractères lèvera un avis de dépréciation dans PHP. 8.2 avant d’être définitivement abandonné dans PHP 9.0. Cependant, l’impact sur les sites existants devrait être mineurs puisque le noyau PHP fournit déjà des fonctions pour encoder/décoder les entités Base64, Uuencode, HTML et Quoted-Printable, grâce à des fonctions dédiées distinctes, comme :

base64_decode (string $ string, bool $ strict = false) : string|false

Et vous, en tant que développeur et professionnel de l’IT, avez-vous repéré des évolutions et changements majeurs dans PHP 8.2 ? N’hésitez pas à nous partager vos avis sur cette nouvelle version du langage sur le forum IT.

 

Par Laura Pouget, Rédactrice Web SEO & Développeuse Informatique.

 

Sources et liens utiles :

Boostez votre carrière

Les meilleures offres d’emploi sont chez Free-Work

Notre CVthèque est la première source de recherche de talents pour + 1 000 entreprises. Déposez votre CV et postulez en un clic !

Continuez votre lecture autour des sujets :
# Actualités
# Programmation
# Développeur

Commentaire

Dans la même catégorie