Maison >développement back-end >tutoriel php >Utilisation des traits dans PHP 5.4
Guide de l'utilisation des traits dans PHP 5.4
Points de base
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
. 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:
<code class="language-php"><?php class DbReader extends Mysqli { } class FileReader extends SplFileObject { }</code>
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.
<code class="language-php"><?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; }</code>
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()
.
<code class="language-php"><?php class DbReader extends Mysqli { } class FileReader extends SplFileObject { }</code>
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à!
<code class="language-php"><?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; }</code>
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.
<code class="language-php"><?php $a = DbReader::getInstance(); $b = FileReader::getInstance(); var_dump($a); //object(DbReader) var_dump($b); //object(FileReader)</code>
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>
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!