Damien Flandrin

Développeur Web

PHP - Les traits

il y a 9 mois · 3 MIN DE LECTURE
#PHP 

En PHP 5.4, une nouvelle construction, appelée «trait», a été introduite dans le langage. En utilisant les traits, il était maintenant possible pour les classes PHP d'hériter des méthodes et des propriétés de plusieurs sources. Une solution directe au problème de l'héritage unique.

Voici un exemple :

<?php

trait PersonTrait
{

}

Comme vous pouvez le voir, un trait ressemble beaucoup à une classe. Au lieu de cela, il est déclaré en utilisant le mot-clé trait. Il existe une convention de nommage lorsqu'on créer un trait qui consiste à ajouter le suffixe Trait, je vous invite donc à suivre cette convention lorsque vous créez vos Traits afin de garder une structure clair.

Contrairement à une classe, ce qu'il est important de se rappeler, c'est que vous ne pouvez pas ajouter étendre ou implémenter un trait. Vous ne pouvez pas non plus instancier un trait. Leur seul but est d'améliorer nos classes, et non de les remplacer.

Les traits peuvent avoir des méthodes, tout comme les classes. Imaginons une classe Person.

<?php
abstract class Person
{

}

Notre classe appelée Person est une classe abstraite. Cela signifie qu'elle est destiné à être étendu par d'autres classes qui représentent des personnes.

Considérez la possibilité que nous aimerions ajouter une méthode fireball(). Par exemple, nous aimerions envoyer des boules de feu pour faire de la magie. Nous pourrions ajouter quelque chose comme ce qui suit.

<?php
abstract class Person
{
    public function fireball()
    {
        echo 'This Person send a fireball';
    }
}

Le problème est que vous ne voulez pas que tous le monde puissennt lancer une boule de feu, c'est là que les traits entre en jeu.

Les traits sont parfaits pour ajouter des méthodes à un objet. Nous voulons ajouter un trait aux humain qui ont des pouvoirs magiques, donc ce que nous cherchons est un PowerTrait

<?php

trait PowerTrait
{
    public function fireball()
    {
        echo 'This person send a fireball.';
    }
}

Nou avons déplacé la méthode fireball() vers le trait. Vous ne trouverez aucune autre différence ici. Cela signifie que nous pouvons également retirer la méthode de Person, comme ceci.

<?php
abstract class Animal
{

}

Créons une classe Elfe qui hérite de Person.

class Elfe extends Person
{
    private $name = 'Legolas'; // Oui je sais Legolas ne tire pas de boule de feu mais j'avais que lui en tête...
}

Nous avons étendu la classe Elfe, et bien qu'elle soit vide pour le moment. Imaginons que les Elfes peut lancer des sorts, nous allons de l'avant et nous utiliserons le trait PowerTrait

<?php

class Elfe extends Person
{
    use PowerTrait;

    private $name = 'Legolas';
}

Le mot-clé utilisé pour ajouter un trait à une classe est le mot clé use en plaçant la déclaration use PowerTrait;

Essayons d'utiliser la méthode héritée de notre trait.

<?php

// Create a new red panda.
$legolas = new Elfe;

// Stroke the panda.
$legolas->fireball();

Maintenant, nous n'avons utilisé qu'un seul trait dans ce scénario, mais il est tout à fait possible d'utiliser autant de traits que nécessaire. Par exemple, ce qui suit est possible.

<?php

class Elfe extends Person
{
    use PlayerTrait;
    use PowerTrait;
    use AttributTrait;

    private $name = 'Legolas';
}

Utilisez les traits pour améliorer la fonctionnalité de vos classes. Bien sûr, vous ne pouvez les utiliser que sur du PHP >= 5.4, alors gardez cela à l'esprit.

Priorité

Vous vous posez peut-être une question suivante. Que se passe-t-il si nous étendons une classe et utilisons un trait qui a une méthode du même nom.

Voyez par exemple :

<?php
trait TestTrait
{
    public function test()
    {
        echo 'Méthode d'un trait';
    }
}

class TestClass
{
    public function test()
    {
        echo 'Méthode d'une classe';
    }
}

Ici, nous avons un TestTrait et un TestClass. Ils ont tous deux une méthode appelée test(), qui indique la source de l'appel de la méthode.

Il est temps de tester :

<?php

class Testing extends TestClass
{
    use TestTrait;
}

$test = new Testing;

$test->test();

Nous avons créé une classe qui étend la classe TestClass et utilise TestTrait. En appelant la méthode partagée test(), nous pouvons déterminer laquelle est prioritaire à la sortie. Faisons un essai.

Méthode d'un trait

nous pouvons voir que la méthode du trait, est prioritaire sur la méthode dans la classe héritée.

Cela signifie que nous pouvons utiliser des traits pour remplacer la fonctionnalité héritée des classes abstraites. C'est une chose utile à comprendre si vous souhaitez utiliser des traits.

···

Damien Flandrin

Je suis développeur web pour l'agence Carredas, je fais principalement du PHP avec Laravel et de l'intégration sur des projets Wordpress.
comments powered by Disqus


Développeur Web - Damien Flandrin