Cet article est traduit, adresse originale : https://stitcher.io/blog/php-81-new-in-initializers
PHP 8.1 : Initialiseur (nouveau dans les initialiseurs)
PHP 8.1 en a ajouté un cela peut sembler un petit détail, mais je pense que cela aura un grand impact quotidien sur de nombreuses personnes. Alors, de quoi parle ce « Quoi de neuf dans la RFC Initializer » ? Regardons un exemple ; nous avons tous écrit du code comme celui-ci :
class MyStateMachine { public function __construct( private ?State $state = null, ) { $this->state ??= new InitialState(); } }
Dans cet exemple de machine à états, nous voulons structurer notre classe de deux manières : avec et sans état initial. Si nous le construisons sans état initial, nous voulons définir un état par défaut. PHP prend certainement en charge la définition des valeurs initiales directement dans la liste des paramètres, mais uniquement pour les types primitifs. Par exemple, si notre machine à états utilise des chaînes en interne au lieu d'objets, nous pouvons écrire son constructeur comme ceci :
class MyStateMachine { public function __construct( private string $state = 'initial', ) { } }
Ainsi, en PHP 8.1, nous pouvons également utiliser la même syntaxe de « valeur par défaut » pour les objets. En d'autres termes : vous pouvez utiliser de nouveaux paramètres par défaut (c'est un exemple d'"initialiseur") :
class MyStateMachine { public function __construct( private State $state = new InitialState(), ) { } }
Les "initialiseurs" ne sont pas que des paramètres par défaut, voici une explication simple tirée de la RFC :
Cette RFC propose de nouvelles expressions. autorisés dans les valeurs par défaut des paramètres, les paramètres de propriété, les initialiseurs de variables statiques et les initialiseurs de constantes globales
Vous avez bien lu : les propriétés sont également dans cette liste ! Imaginez une simple bibliothèque de validation qui utilise des attributs pour valider les entrées dans les propriétés. Peut-être qu'il devrait être capable de valider des éléments de tableau comme celui-ci :
class CreateEmailsRequest extends FormRequestData { #[ValidArray( email: [new Required, new ValidEmail], name: [new Required, new ValidString], )] public array $people; }
Avant PHP 8.1, vous ne pouviez pas écrire de code comme celui-ci car vous n'étiez pas autorisé à utiliser les nouveaux attributs en raison de la façon dont ils étaient évalués, mais maintenant tu peux!
Jetons un coup d’œil à quelques détails importants qui méritent d’être mentionnés.
Voulez-vous en savoir plus sur PHP 8.1 ? Il existe un chemin vers PHP 8.1. Pendant les 10 prochains jours, vous recevrez un e-mail quotidien concernant une fonctionnalité nouvelle et existante de PHP 8.1, vous serez alors automatiquement désabonné afin de ne pas recevoir de spam ou d'e-mails de suivi. Abonnez-vous maintenant !
#Construire uniquement lorsque cela est nécessaire
Ces "nouvelles valeurs" ne seront construites que lorsque cela est réellement nécessaire. Cela signifie que, dans notre premier exemple, InitialState ne créera un nouvel objet que si aucun argument n'est donné :
class MyStateMachine { public function __construct( private State $state = new InitialState(), ) { } } new MyStateMachine(new DraftState()); // No InitialState is created new MyStateMachine(); // But now it is
Par exemple, dans le cas des propriétés, l'objet ne sera créé que si newInstance est appelé sur une propriété réfléchissante.
#Pas dans un attribut de classe
Vous devez également savoir que new ne peut pas être utilisé comme valeur par défaut dans un attribut de classe. La prise en charge de cette fonctionnalité introduit un certain nombre d'effets secondaires imprévus, par exemple lors de la sérialisation et de la désérialisation d'objets.
class MyStateMachine { private State $state = new InitialState(); }
Heureusement, nous avons des propriétés hissées qui autorisent les valeurs par défaut, car PHP convertira la syntaxe de levage des propriétés pour conserver la valeur par défaut dans les paramètres du constructeur, mais pas dans les propriétés réelles.
Voici la version traduite :
class MyStateMachine { private State $state; public function __construct( State $state = new InitialState(), ) { $this->state = $state; } }
#ENTRÉES FINÉES
Vous l'avez peut-être deviné, mais lors de la construction d'un nouvel objet dans un initialiseur, vous ne pouvez transmettre qu'un ensemble limité d'entrées. Par exemple, vous ne pouvez pas utiliser de variables, d'opérateurs de propagation, de classes anonymes, etc. C’est quand même un ajout très bienvenu !
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!