Maison > développement back-end > tutoriel php > Utilisation des traits dans PHP 5.4

Utilisation des traits dans PHP 5.4

Joseph Gordon-Levitt
Libérer: 2025-02-28 10:15:55
original
215 Les gens l'ont consulté

Guide de l'utilisation des traits dans PHP 5.4

Using Traits in PHP 5.4

Points de base

  • Le mécanisme des traits introduit dans PHP 5.4 permet une réutilisation horizontale du code entre les classes indépendantes de hiérarchie d'héritage, résolvant les limites de l'héritage unique et réduisant la duplication du code.
  • La classe unique peut utiliser plusieurs traits et les traits peuvent également être composés d'autres traits, permettant une manière flexible et modulaire d'organiser le code.
  • Utilisez le mot-clé insteadof pour résoudre les conflits entre les traits avec le même nom de méthode, ou pour créer un alias de méthode à l'aide du mot-clé as.
  • Les traits peuvent accéder à des propriétés privées ou à des méthodes d'une classe composite, et vice versa, et peuvent même contenir des méthodes abstraites que la classe composite doit implémenter.

Un objectif important de la programmation orientée objet est de minimiser la duplication de code grâce à une meilleure organisation et à une réutilisation de code. Mais dans PHP, cela peut parfois être difficile en raison des limites du modèle d'héritage unique qu'il utilise; Des langages comme C et Python nous permettent de hériter de plusieurs classes, ce qui résout ce problème dans une certaine mesure, tandis que Mixin in Ruby nous permet de mélanger la fonctionnalité d'une ou plusieurs classes sans utiliser l'héritage. Cependant, l'héritage multiple a des problèmes tels que le problème du diamant, et le mélange est également un mécanisme complexe. Dans cet article, je vais discuter des traits, une nouvelle fonctionnalité introduite dans PHP 5.4 pour surmonter ces problèmes. Le concept de traits lui-même n'est pas nouveau en programmation et est utilisé dans d'autres langages tels que Scala et Perl. Ils nous permettent de réutiliser horizontalement le code entre les classes indépendantes avec différentes classes héritées de hiérarchies.

Apparence du trait

Le trait est similaire à une classe abstraite qui ne peut pas être instanciée séparément (bien qu'elle soit plus souvent comparée à une interface). Le document PHP définit les traits comme suit: & gt; Le but des traits est de réduire certaines des limites de l'héritage unique en permettant aux développeurs de réutiliser librement les ensembles de méthodes dans plusieurs classes indépendantes (existant dans différentes hiérarchies d'héritage de classe).

considérons cet exemple:

<?php
class DbReader extends Mysqli
{
}

class FileReader extends SplFileObject
{
}
Copier après la connexion
Copier après la connexion

Ce serait un problème si les deux classes nécessitent des fonctionnalités communes, comme les fabriquer les deux singletons. Étant donné que PHP ne prend pas en charge l'héritage multiple, chaque classe doit implémenter le code nécessaire qui prend en charge le modèle Singleton, ou il y aura une hiérarchie d'héritage dénuée de sens. Les traits fournissent une solution à ce type de problème.

<?php
trait Singleton
{
    private static $instance;

    public static function getInstance() {
        if (!(self::$instance instanceof self)) {
            self::$instance = new self;
        }
        return self::$instance;
    }
}

class DbReader extends ArrayObject
{
    use Singleton;
}

class  FileReader
{
    use Singleton;
}
Copier après la connexion
Copier après la connexion

Singleton Le trait est implémenté dans une implémentation directe du modèle Singleton, avec une méthode statique getInstance() qui utilise ce trait pour créer un objet de la classe (s'il n'est pas déjà créé) et le renvoie. Essayons de créer des objets de ces classes à l'aide de la méthode getInstance().

<?php
class DbReader extends Mysqli
{
}

class FileReader extends SplFileObject
{
}
Copier après la connexion
Copier après la connexion

Nous pouvons voir que $a est un objet de DbReader et $b est un objet de FileReader, mais les deux apparaissent maintenant comme des singletons. La méthode de Singleton a été injectée horizontalement dans la classe qui l'utilise. Les traits n'imposent pas de sémantique supplémentaire à la classe. Dans une certaine mesure, vous pouvez le considérer comme un mécanisme de coche copie assisté par compilateur où les méthodes de Trait sont copiées dans une classe composite. Si nous sous-classez simplement $instance de la classe parent avec un attribut privé DbReader, l'attribut ne sera pas affiché dans le vidage de ReflectionClass::export(). Cependant, avec des traits, c'est là!

<?php
trait Singleton
{
    private static $instance;

    public static function getInstance() {
        if (!(self::$instance instanceof self)) {
            self::$instance = new self;
        }
        return self::$instance;
    }
}

class DbReader extends ArrayObject
{
    use Singleton;
}

class  FileReader
{
    use Singleton;
}
Copier après la connexion
Copier après la connexion

Traits multiples

Jusqu'à présent, nous n'avons utilisé qu'un seul trait dans une classe, mais dans certains cas, nous devrons peut-être fusionner la fonctionnalité de plusieurs traits.

<?php
$a = DbReader::getInstance();
$b = FileReader::getInstance();
var_dump($a);  //object(DbReader)
var_dump($b);  //object(FileReader)
Copier après la connexion

Ici, nous avons deux traits, Hello et World. Hello Le trait ne peut dire que "bonjour", World le trait ne peut dire que "monde". Dans la classe MyWorld, nous avons appliqué Hello et World pour que l'objet MyWorld ait des méthodes de ces deux traits et puisse dire "Hello World".

traits composés de traits

à mesure que l'application se développe, nous aurons probablement un ensemble de traits utilisés dans différentes classes. PHP 5.4 nous permet d'avoir des traits composés d'autres traits afin que nous ayons seulement besoin d'inclure plusieurs traits dans un seul trait, plutôt que de plusieurs traits dans toutes ces classes. Cela nous permet de réécrire l'exemple précédent comme suit:

<code>Class [  class FileReader ] {
  @@ /home/shameer/workplace/php54/index.php 19-22

  - Constants [0] {
  }
  - Static properties [1] {
    Property [ private static $_instance ]
  }
  - Static methods [1] {
    Method [  static public method instance ] {
      @@ /home/shameer/workplace/php54/index.php 6 - 11
    }
  }
  - Properties [0] {
  }
  - Methods [0] {
  }
}</code>
Copier après la connexion

Ici, nous avons créé le trait HelloWorld, utilisé les traits Hello et World et l'avons inclus dans le MyWorld. Puisque HelloWorld le trait a des méthodes des deux autres traits, c'est exactement la même chose que si nous avons inclus ces deux traits nous-mêmes dans la classe.

(Le contenu suivant sera brièvement résumé en raison des limitations de l'espace et des informations de base conservées)

Ordre de priorité: La méthode de trait a une priorité plus élevée que la méthode de la classe parent, et la méthode de classe a une priorité plus élevée que la méthode de trait.

Résolution et alias des conflits: Utiliser insteadof pour sélectionner la méthode des traits à utiliser et utiliser as pour créer un alias de méthode pour éviter les conflits.

Réflexion: ReflectionClass getTraits() Fournit des méthodes pour obtenir des informations sur les traits dans une classe, tels que getTraitNames(), isTrait(), getTraitAliases() et

.

Autres caractéristiques:

Les traits peuvent accéder aux propriétés privées et aux méthodes d'une classe combinée, et vice versa;

Résumé:

Les traits sont l'une des fonctionnalités les plus puissantes introduites dans PHP 5.4, et cet article traite de presque toutes ses fonctionnalités. Ils permettent aux programmeurs de réutiliser des extraits de code horizontalement entre plusieurs classes qui n'ont pas à être dans la même hiérarchie de succession. Ils fournissent un mécanisme de réutilisation du code léger plutôt que une sémantique complexe. Bien qu'il existe certains inconvénients de traits, ils peuvent certainement aider à améliorer la conception de votre application, éliminer la duplication du code et la rendre plus sèche.

(La partie FAQ est omise ici en raison de la durée de l'article. Les informations de base ont été couvertes dans le contenu ci-dessus.)

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!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal