PHP 8.1 est une mise à jour majeure du langage PHP. Il contient de nombreuses nouvelles fonctionnalités, notamment des énumérations, des propriétés en lecture seule, une syntaxe appelable de première classe, des fibres, des types d'intersection, des améliorations de performances, etc.Énumérations
Les énumérations ou « Enums » permettent à un développeur de définir un type personnalisé limité à l'une des valeurs possibles parmi un nombre discret. Cela peut être particulièrement utile lors de la définition d'un modèle de domaine, car cela permet de « rendre les états invalides non représentables ».
Les énumérations apparaissent dans de nombreuses langages avec une variété de fonctionnalités différentes. En PHP, les Enums sont un type particulier d'objet. L'Enum lui-même est une classe et ses cas possibles sont tous des objets à instance unique de cette classe. Cela signifie que les cas Enum sont des objets valides et peuvent être utilisés partout où un objet peut être utilisé, y compris les vérifications de type.
L'exemple le plus populaire d'énumérations est le type booléen intégré, qui est un type énuméré avec les valeurs légales true et false. Les énumérations permettent aux développeurs de définir leurs propres énumérations arbitrairement robustes.
Dans PHP 8.1, les énumérations sont limitées aux « énumérations d'unités », c'est-à-dire aux énumérations qui sont elles-mêmes une valeur, plutôt qu'une simple syntaxe sophistiquée pour une constante primitive, et n'incluent pas d'informations associées supplémentaires. Cette capacité offre une prise en charge considérablement étendue de la modélisation des données, des définitions de types personnalisées et du comportement de style monade. Les énumérations permettent la technique de modélisation consistant à « rendre les états invalides non représentables », ce qui conduit à un code plus robuste avec moins de tests exhaustifs.
Les responsables du langage recommande d'utiliser les énumérations au lieu d'un ensemble de constantes et d'obtenir ainsi une validation prête à l'emploi.
Par exemple, avant PHP 8.1, vous pouviez écrire :
| Code PHP : | Sélectionner tout |
1 2 3 4 5 6 7 | class Status { const DRAFT = 'draft'; const PUBLISHED = 'published'; const ARCHIVED = 'archived'; } function acceptStatus(string $status) {...} |
Ce code est optimisé en PHP 8.1 avec les énumérations :
| Code PHP : | Sélectionner tout |
1 2 3 4 5 6 7 | enum Status { case Draft; case Published; case Archived; } function acceptStatus(Status $status) {...} |
Propriétés en lecture seule readonly
Les objets valeur sont souvent immuables : les propriétés sont initialisées une fois dans le constructeur et ne doivent pas être modifiées par la suite. PHP n'a actuellement aucun moyen d'appliquer cette contrainte. L'alternative la plus proche consiste à déclarer la propriété private et à n'exposer qu'un getter public :
| Code PHP : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 | class User { public function __construct( private string $name ) {} public function getName(): string { return $this->name; } } |
Cela ne rend pas réellement la propriété en lecture seule, mais cela resserre la portée où une modification pourrait se produire sur une seule déclaration de classe. Malheureusement, cela nécessite l'utilisation d'un passe-partout getter, ce qui entraîne une moins bonne ergonomie.
La prise en charge des propriétés en lecture seule de première classe vous permet d'exposer directement les propriétés publiques en lecture seule, sans craindre que les invariants de classe puissent être rompus par une modification externe :
| Code PHP : | Sélectionner tout |
1 2 3 4 5 | class User { public function __construct( public readonly string $name ) {} } |
Aussi, cette proposition a été retenue : une propriété en lecture seule ne peut être initialisée qu'une seule fois, et uniquement à partir de la portée où elle a été déclarée. Toute autre affectation ou modification de la propriété entraînera une exception d'erreur.
| Code PHP : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | class Test { public readonly string $prop; public function __construct(string $prop) { // Legal initialization. $this->prop = $prop; } } $test = new Test("foobar"); // Legal read. var_dump($test->prop); // string(6) "foobar" // Illegal reassignment. It does not matter that the assigned value is the same. $test->prop = "foobar"; // Error: Cannot modify readonly property Test::$prop |
Cette variante n'est pas autorisée, car l'affectation d'initialisation se fait depuis l'extérieur de la classe :
| Code PHP : | Sélectionner tout |
1 2 3 4 5 6 7 8 | class Test { public readonly string $prop; } $test = new Test; // Illegal initialization outside of private scope. $test->prop = "foobar"; // Error: Cannot initialize readonly property Test::$prop from global scope |
Les modifications ne sont pas nécessairement des affectations simples, tous les éléments suivants entraîneront également une exception d'erreur :
| Code PHP : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | class Test { public function __construct( public readonly int $i = 0, public readonly array $ary = [], ) {} } $test = new Test; $test->i += 1; $test->i++; ++$test->i; $test->ary[] = 1; $test->ary[0][] = 1; $ref =& $test->i; $test->i =& $ref; byRef($test->i); foreach ($test as &$prop); |
Cependant, les propriétés en lecture seule n'excluent pas la mutabilité intérieure. Les objets (ou ressources) stockés dans des propriétés en lecture seule peuvent toujours être modifiés en interne :...
La fin de cet article est réservée aux abonnés. Soutenez le Club Developpez.com en prenant un abonnement pour que nous puissions continuer à vous proposer des publications.

