Dynamic-Mess.com


"The world is a dynamic mess of jiggling things..."

Les traits en PHP

Article posté le 03-01-2014 dans la catégorie PHP

Article mis à jour le : 05-05-2022

Quelques notions sur les traits en PHP

En PHP, il existe un concept appelé "les traits".

Concrètement, ils s'agit de mini-classes qui ont pour but de factoriser du code, plus précisément d'éviter la duplication de code. Ces traits sont inclus dans vos classes, qui peuvent en utiliser un nombre illimité, avec possibilité de définir une priorité d'un trait par rapport à l'autre. De plus, un trait peut lui-même appeler un autre trait.

Mais voyons un exemple, simple...

1- Utilisation basique d'un trait

Soit deux classes qui utilise un code pour additionner deux valeurs. Ce code est identique dans chacun d'entre elles, ce qui signifie qu'il est dupliqué, et qu'en cas de mise à jour, il devra être modifié x fois. Pour éviter cela, nous pouvons utiliser un trait:

trait traitCalcul
{
    public function calcule($a, $b)
    {
        return($a+$b);
    }
}
class classeA
{
    private $a=4;
    private $b =5;
    use traitCalcul; //Inclusion du trait
    function maFonction()
    {
        // $c = $a+$b; // Ca c'était avant la factorisation
        $c = $this->calcule($this->a, $this->b);//Ca c'est avec la factorisation
        echo "Le nombre calculé est ".$c;
    }
}
$a = new classeA();
$a->maFonction();
//Affiche "Le nombre calculé est 9"

Comme vous pouvez le constater, l'instanciation de la classe classeA et l'appel de la fonction maFonction, permet d'utiliser ainsi ce code factorisé grâce à l'inclusion du trait.

2- Inclusion de plusieurs traits, et priorités

Pour appeler plusieurs traits :

use traitA, traitB;

En cas de conflit (méthode ayant le même nom dans deux traits inclus), on peut utiliser un système de priorité. Admettons que traitA et traitB aient tous deux une méthode appelée "theFonction"; Nous souhaitons que traitA soit prioritaire, alors à l'inclusion, il faudra inscrire :

use traitA, traitB
{
traitA::theFonction insteadof traitB;
}

Autres priorités, mais entre classe et trait cette fois. En cas de méthode au nom identique, celle de la classe l'emporte. Il y a cependant un piège pour l'héritage. Admettons que la classe B, qui inclue le trait "monTrait", hérite de la classe A, et que monTrait et la classe A aient une méthode avec le même nom. Dans ce cas, le trait est prioritaire, par rapport à la classe mère.

3- Et les attributs?

Les traits peuvent aussi avoir des attributs. En cas de conflit, la règle est un peu différente : si la classe qui inclue le trait tente d'implémenter une variable au nom identique qu'une variable du trait, alors ce ne sera pas possible... Vous aurez droit à une erreur (attention à ca d'ailleurs, car elles ne sont pas toujours toutes affichées selon les configuration des serveurs...).

4- Trait qui utilise un autre trait

A la manière des classes, un trait peut appeler un trait. Il suffit d'utiliser également le mot-clef "use".


Cet article vous a plu? Découvrez d'autres articles :


comments powered by Disqus