7 min de lecture 29 vues

PHP 8.4 : Découverte des Property Hooks et d'autres nouveautés

asmitta-01

Brayan Tiwa

@asmitta-01

PHP 8.4 : Découverte des Property Hooks et d'autres nouveautés

Introduction

Vous êtes développeur PHP ? Alors vous allez être ravi d'apprendre que PHP 8.4 est désormais disponible. Après les nouveautés introduites dans PHP 8.3, comme les constantes de classe typées et les améliorations apportées à la manipulation des tableaux, PHP 8.4 nous surprend à nouveau avec les Property Hooks. Ces fonctionnalités, combinées à d'autres optimisations, font de PHP un langage toujours plus moderne et performant. Cette nouvelle version introduit d'autres améliorations qui vont simplifier votre quotidien et vous permettre de développer des applications plus performantes. Dans cet article, nous allons passer en revue les principales nouveautés et vous montrer comment les mettre en pratique.

Les nouveautés de PHP 8.4

1. Hooks de propriété

Un hook peut-être vu comme une fonction qui est déclenchée lors d'un évènement, c'est très similaire aux fonctions reçues en Javascript par la fonction addEventListener. Dans notre cas, ce sont des fonctions déclenchées lorsqu'une propriété est accédée(en lecture ou écriture). Les hooks de propriétés viennent révolutionner la façon dont nous interagissons avec les propriétés des objets. Contrairement aux getters et setters traditionnels, qui nécessitent la création de méthodes supplémentaires, les hooks de propriétés s'intègrent directement à la définition de la propriété. Cette approche plus concise et élégante permet d'améliorer la lisibilité de votre code et de réduire la quantité de code boilerplate. Prenons par exemple ce code:

<?php
 
class Foo
{
private int $runs = 0;
 
public function getRuns(): int
{
return $this->runs;
}
 
public function setRuns(int $runs): void
{
if ($runs <= 0) throw new Exception();
$this->runs = $runs;
}
}
 
$f = new Foo();
$f->setRuns($f->getRuns() + 1);

Avec la version 8.4, il peut être simplifier en ceci:

class Foo
{
public int $runs = 0 {
set {
if ($value <= 0) throw new Exception();
$this->runs = $value;
}
}
}
 
$f = new Foo();
$f->runs++;

Autre point intéressant, Si le hook get est une expression unique, alors les instructions { } et return peuvent être omises et remplacées par =>, tout comme avec les fonctions fléchées. Autrement dit, les deux exemples suivants sont équivalents :

public string $fullName {
get {
return $this->first . " " . $this->last;
}
}
 
public string $fullName {
get => $this->first . " " . $this->last;
}

2. Visibilité asymétrique

PHP a depuis longtemps la possibilité de contrôler la visibilité des propriétés des objets (publiques, privées ou protégées). Cependant, ce contrôle est toujours le même pour les opérations get et set. Autrement dit, elles sont « symétriques ». La 8.4 propose de permettre aux propriétés d'avoir une visibilité séparée (« asymétrique »), avec une visibilité séparée pour les opérations de lecture et d'écriture. Considérons le code suivant:

class PhpVersion
{
private string $version = '8.3';
 
public function getVersion(): string
{
return $this->version;
}
}

La propriété $version est privée mais nous voulons permettre son accès en lecture depuis l'extérieur, d'où la présence de la fonction getVersion(). Mais c'est un petit peu verbeux, desormais avec la version 8.4 on pourra tout simplement ecrire:

class PhpVersion
{
public private(set) string $version = '8.4';
}

L'instruction public private(set) ... veut dire que notre propriété est publique, mais accessible en écriture de manière privée. Donc on peut faire un $maClasse->version uniquement pour lire, un accès en écriture déclenchera une erreur.

3. L'attribut #[\Deprecated]

La dépréciation d'une méthode ou classe se faisait uniquement dans nos éditeurs de code ou IDE avec :

/**
* @deprecated 8.3 utilisez PhpVersion::getVersion() plutôt
*/
function getPhpVersion(): string
{
return $this->getVersion();
}
 
// Aucun mesage

Dans le terminal ou navigateur on avait jamais un message de dépréciation, ce n'est plus le cas dans la version 8.4. La dépréciation faite comme suit soulèvera des messages provenant de PHP(et non l'éditeur uniquement).

#[\Deprecated(
message: "utilisez PhpVersion::getVersion() plutôt",
since: "8.4",
)]
function getPhpVersion(): string
{
return $this->getVersion();
}
 
// Message: Deprecated: Method PhpVersion::getPhpVersion() is deprecated since 8.4, utilisez PhpVersion::getVersion() plutôt

4. Autres nouveautés

La version 8.4 énormément de nouvelles fonctionnalités, tout ne pouvant être cité ci-dessous une liste de non exhaustive de celles-ci:

  • Nouvelle API DOM offrant une prise en charge conforme aux standards pour l'analyse des documents HTML5, corrigeant plusieurs bogues de conformité de longue date dans le comportement des fonctionnalités DOM et ajoutant plusieurs fonctions pour faciliter la manipulation des documents.
  • Nouvelles fonctions array_find(), array_find_key(), array_any() et array_all() sont désormais disponibles.
  • new MyClass()->method() sans parenthèses: Les propriétés et méthodes d'un objet nouvellement instancié peuvent désormais être accessibles sans entourer l'expression new entre parenthèses. Exemple: new PhpVersion()->getVersion() est aussi valide que (new PhpVersion())->getVersion() désormais.
  • Nouvelles fonctions mb_trim(), mb_ltrim(), mb_rtrim(), mb_ucfirst(), et mb_lcfirst().
  • Ajout du support pour les sous-classes spécifiques aux pilotes. Cette version ajoute des sous-classes pour PDO afin de mieux supporter les fonctionnalités spécifiques à la base de données. Ces nouvelles classes peuvent être instanciées soit en appelant la méthode PDO::connect() ou en instanciant directement une instance de la sous-classe spécifique au pilote.

Impacts et conséquences

Les hooks de propriétés introduits en PHP 8.4 représentent une évolution significative dans la façon dont nous concevons et interagissons avec les objets. Cette nouvelle fonctionnalité offre de nombreux avantages, mais soulève également quelques questions.

Avantages

  • Amélioration de la lisibilité et de la maintenabilité du code: Syntaxe concise: Les hooks de propriétés réduisent la verbosité du code en éliminant le besoin de méthodes getter et setter explicites.
  • Encapsulation renforcée: Les hooks permettent d'imposer des règles strictes sur les valeurs autorisées, les types, et les opérations pouvant être effectuées sur une propriété.
  • Flexibilité accrue: Les hooks permettent d'implémenter des comportements complexes tels que la validation, la transformation, la mise en cache, ou encore la notification d'événements.
  • Adaptabilité: Les hooks facilitent l'évolution des classes en permettant d'ajouter de nouvelles fonctionnalités sans impacter le reste du code.
  • Productivité accrue: Les hooks éliminent le besoin d'écrire des méthodes getter et setter redondantes, ce qui accélère le développement.
  • Meilleure maintenabilité: Un code plus concis et plus expressif est plus facile à maintenir et à faire évoluer.

Conséquences et défis

  • Courbe d'apprentissage: Les développeurs devront s'adapter à cette nouvelle façon de travailler avec les propriétés.
  • Complexité potentielle: Une utilisation excessive ou mal maîtrisée des hooks peut rendre le code plus difficile à comprendre et à déboguer.
  • Interopérabilité: Les hooks de propriétés peuvent poser des problèmes d'interopérabilité avec du code existant ou des bibliothèques tierces qui ne sont pas conçues pour fonctionner avec cette fonctionnalité.

Conclusion

En conclusion, PHP 8.4 est une version majeure qui apporte de nombreuses améliorations tant au niveau des performances que de la syntaxe. Les hooks de propriétés, associés à la visibilité asymétrique et aux nouvelles fonctions pour les tableaux, offrent aux développeurs de nouveaux outils pour écrire du code plus élégant, plus maintenable et plus performant. Bien que leur utilisation puisse sembler complexe au premier abord, les bénéfices qu'ils apportent en termes de lisibilité et de maintenabilité du code en font un outil indispensable. N'hésitez pas à expérimenter les hooks de propriétés et ces nouvelles fonctionnalités dans vos projets pour en apprécier pleinement le potentiel. Cette version marque une nouvelle étape dans l'évolution de PHP et s'impose comme un choix incontournable pour les projets web modernes. Vous avez des questions spécifiques sur les hooks de propriétés, la visibilité asymétrique ou d'autres fonctionnalités de PHP 8.4 ? Posez les dans les commentaires.

Vous aimez cet article ? Faite le savoir en partageant