Promotion de la propriété du constructeur en PHP 8 – CloudSavvy IT


Logo PHP

La promotion de la propriété du constructeur est une nouvelle fonctionnalité pratique de PHP 8 qui vous aide à minimiser la répétition du code. Il vous permet de combiner la définition et l’initialisation des propriétés en une seule instruction de constructeur.

Une classe traditionnelle

La promotion de la propriété du constructeur (CPP à partir de là) est la plus utile dans le contexte des objets de valeur. Il s’agit généralement de classes simples qui décrivent une structure de données. Voici à quoi on pourrait ressembler en PHP 7.4:

class BlogPost 
 
    protected string $Title;
 
    protected string $Content;
 
    protected DateTimeImmutable $PostedDate;
 
 
    public function __construct(
        string $Title,
        string $Content,
        DateTimeImmutable $PostedDate) 
 
        $this -> Title = $Title;
        $this -> Content = $Content;
        $this -> PostedDate = $PostedDate;
    
 

Nous avons créé une classe assez longue, bien que n’ayant que trois propriétés! Chaque nom de propriété apparaît quatre fois, les indications de type étant écrites deux fois. Si vous deviez modifier l’une des propriétés ou en ajouter une autre, vous toucheriez trois lignes de code.

Voici le même exemple, réécrit pour utiliser CPP en PHP 8:

class BlogPost 
    public function __construct(
        protected string $Title,
        protected string $Content,
        protected DateTimeImmutable $PostedDate) 

En utilisant le CPP, nous avons considérablement réduit la taille de notre classe. Vous n’avez besoin d’ajouter ou de modifier qu’une seule ligne de code lorsque vous travaillez avec les propriétés de cette classe.

Regarder de plus près

CPP combine la définition de propriété avec la liste de paramètres du constructeur. Pour créer une propriété promue, préfixez son nom avec un modificateur de visibilité de classe – public, protected ou private.

Une fois promue, la propriété se comporte comme toute autre propriété de classe. Vous pouvez y accéder dans la classe en utilisant $this -> Property ou en externe (si c’est un public propriété). En interne, PHP transforme simplement la syntaxe compacte en une version beaucoup plus longue prise en charge par PHP 7.

Vous n’êtes pas obligé d’utiliser des caractères avec des propriétés promues – il est acceptable d’écrire protected $Title, par exemple. Vous pouvez définir des valeurs par défaut en utilisant la même syntaxe qu’un paramètre de constructeur standard (protected string $Title = "Example Post").

Utilisation avec un corps de constructeur

Votre constructeur ne sera pas toujours aussi simple que notre exemple. Vous devrez peut-être effectuer des contrôles de validation ou transformer une valeur.

Vous pouvez toujours écrire un corps de constructeur lors de l’utilisation de CPP. Vous pourrez accéder aux valeurs de vos propriétés promues en tant que variable d’instance promue ou en utilisant la variable locale:

public function __construct(protected string $Title) 
    if (!$this -> Title) 
        throw new InvalidArgumentException("Title cannot be empty.");
    
    // OR
    if (!$Title) 
        throw new InvalidArgumentException("Title cannot be empty.");
    

Quelle que soit l’approche que vous choisissez, la variable ou la propriété, vous travaillerez avec la même valeur. PHP masque simplement le $this -> Title = $Title ligne que vous écrivez normalement manuellement.

Combinaison avec des propriétés et des paramètres réguliers

Vous pouvez librement mélanger des propriétés promues avec des définitions de propriétés régulières. En outre, vous pouvez combiner des propriétés promues et non promues dans vos paramètres de constructeur.

class BlogPost 
    public ?DateTimeImmutable $PostedDate = null;
 
    public function __construct(public string $Title, bool $isPosted=true) 
        if ($isPosted) $this -> PostedDate = new DateTimeImmutable();
    

Vous devez être prudent lorsque vous mélangez ces syntaxes. Les propriétés promues peuvent facilement être ignorées lors du survol du code, en particulier si elles sont précédées de définitions de propriétés de classe normales. Si votre classe possède déjà plusieurs propriétés utilisant le formulaire traditionnel, l’utilisation de la nouvelle syntaxe pour un ajout supplémentaire peut ne pas être la meilleure approche pour ce fichier.

Utiliser avec des attributs

L’une des autres nouvelles fonctionnalités de PHP 8 était les attributs. Ceux-ci vous permettent d’annoter des métadonnées supplémentaires par rapport aux entités de votre base de code.

Les attributs sont entièrement pris en charge sur les propriétés promues. Comme il est ambigu de savoir si l’attribut s’applique à un définition de propriété ou un paramètre de méthode, PHP l’appliquera aux deux.

Cela signifie que vous récupérerez la même valeur que vous inspectiez la propriété ou le paramètre du constructeur. Cette approche flexible garantit que vous ne perdez aucune fonctionnalité des attributs en adoptant la promotion de la propriété du constructeur.

Réflexion

Les propriétés promues – et les arguments de constructeur qui promeuvent une propriété – se comportent de manière intuitive lorsqu’elles sont introspectionnées via les API Reflection. La réflexion examine les propriétés promues dans leur état de post-transpilation, de sorte qu’elles semblent identiques à une propriété explicitement déclarée.

Les deux ReflectionProperty et ReflectionParameter les classes ont de nouvelles isPromoted() méthodes pour vous permettre de vérifier s’ils étaient impliqués dans le RPC. En général, cela ne devrait pas être pris en compte, sauf si vous écrivez un outil qui souhaite reproduire la structure source exacte.

Gotchas possibles

Vous ne pouvez pas déclarer les noms de classe en double et de propriété promue. L’exemple suivant entraînerait une erreur d’exécution:

class BlogPost 
    public string $Title;
 
    public function __construct(public string $Title) 

C’est parce que PHP ne fait rien de spécial avec les définitions de propriétés promues. Il transpile simplement votre code source laconique dans le style PHP 7.4. Cela entraînerait deux public string $Title lignes, ce qui a toujours été interdit.

Il existe d’autres cas où le RPC peut entraîner une erreur. Les propriétés promues sont interdites dans les classes abstraites, bien qu’elles puissent être utilisées dans les traits. Vous ne pouvez pas utiliser le callable tapez avec eux car il n’est pas pris en charge pour les définitions de propriété. Enfin, il n’y a pas de support pour les paramètres variadiques (par exemple public string ...$strings) car la propriété finirait par être une array de string instances, pas un string lui-même.

Conclusion

La promotion de la propriété du constructeur rend beaucoup plus rapide l’écriture de nouveaux objets de valeur dans votre base de code. Il peut réduire le nombre de lignes jusqu’à deux tiers! CPP vous aide également à SÉCHER (Don’t Repeat Yourself) votre code en évitant la répétition disgracieuse des typhints et des noms de propriétés requis par PHP 7.4.

L’adoption du CPP est facultative et n’aura pas toujours de sens pour les classes existantes. Il convient mieux aux classes simples de type struct, dans lesquelles vous souhaitez fournir un typage fort aux données qui seront transmises via votre base de code.



Vous pouvez lire l’article original (en Angais) sur le sitewww.cloudsavvyit.com