Maison >développement back-end >tutoriel php >Définition simple et introduction à l'utilisation des traits de réutilisation du code PHP
Traits est un mécanisme de réutilisation de code pour les langages à héritage unique comme PHP. Les traits sont conçus pour réduire les contraintes des langages à héritage unique et permettre aux développeurs de réutiliser librement des ensembles de méthodes dans des classes indépendantes au sein de différentes hiérarchies. La sémantique des traits et la composition des classes définissent un moyen de réduire la complexité et d'éviter les problèmes typiques associés à l'héritage multiple et aux mixins traditionnels.
Le trait est similaire à une classe, mais est uniquement destiné à combiner des fonctionnalités de manière fine et cohérente. Le trait ne peut pas être instancié par lui-même. Il ajoute une combinaison de fonctionnalités horizontales à l'héritage traditionnel ; c'est-à-dire que les membres des classes d'application n'ont pas besoin d'être hérités.
Exemple de trait
<?php trait ezcReflectionReturnInfo { function getReturnType() { /*1*/ } function getReturnDescription() { /*2*/ } } class ezcReflectionMethod extends ReflectionMethod { use ezcReflectionReturnInfo; /* ... */ } class ezcReflectionFunction extends ReflectionFunction { use ezcReflectionReturnInfo; /* ... */ } ?>
Les membres hérités de la classe de base sont remplacés par les membres insérés par le trait. L'ordre de priorité est que les membres de la classe actuelle remplacent les méthodes du trait et que le trait remplace les méthodes héritées.
Exemple d'ordre de priorité
<?php class Base { public function sayHello() { echo 'Hello '; } } trait SayWorld { public function sayHello() { parent::sayHello(); echo 'World!'; } } class MyHelloWorld extends Base { use SayWorld; } $o = new MyHelloWorld(); $o->sayHello(); ?>
La routine ci-dessus affichera : Hello World !
Les membres hérités de la classe de base sont remplacés par la méthode sayHello dans le trait SayWorld inséré . Son comportement est cohérent avec les méthodes définies dans la classe MyHelloWorld. L'ordre de priorité est que les méthodes de la classe actuelle remplacent les méthodes de trait, qui à leur tour remplacent les méthodes de la classe de base.
Un autre exemple d'ordre de priorité
<?php trait HelloWorld { public function sayHello() { echo 'Hello World!'; } } class TheWorldIsNotEnough { use HelloWorld; public function sayHello() { echo 'Hello Universe!'; } } $o = new TheWorldIsNotEnough(); $o->sayHello(); ?>
La routine ci-dessus affichera : Bonjour Univers !
Plusieurs traits
séparés par des virgules, Plusieurs traits répertoriés dans l'instruction use peut être inséré dans une classe.
Exemples d'utilisation de plusieurs traits
<?php trait Hello { public function sayHello() { echo 'Hello '; } } trait World { public function sayWorld() { echo 'World'; } } class MyHelloWorld { use Hello, World; public function sayExclamationMark() { echo '!'; } } $o = new MyHelloWorld(); $o->sayHello(); $o->sayWorld(); $o->sayExclamationMark(); ?>
La routine ci-dessus affichera : Bonjour tout le monde !
Résolution des conflits
Si deux traits insèrent tous deux un méthode portant le même nom, et une erreur fatale se produira si le conflit n’est pas résolu explicitement.
Afin de résoudre le conflit de nom de plusieurs traits dans la même classe, vous devez utiliser l'opérateur placeof pour spécifier explicitement laquelle des méthodes en conflit utiliser.
La méthode ci-dessus permet uniquement d'exclure d'autres méthodes. L'opérateur as peut introduire l'une des méthodes en conflit sous un autre nom.
Exemple de résolution de conflit
<?php trait A { public function smallTalk() { echo 'a'; } public function bigTalk() { echo 'A'; } } trait B { public function smallTalk() { echo 'b'; } public function bigTalk() { echo 'B'; } } class Talker { use A, B { B::smallTalk insteadof A; A::bigTalk insteadof B; } } class Aliased_Talker { use A, B { B::smallTalk insteadof A; A::bigTalk insteadof B; B::bigTalk as talk; } } ?>
Dans ce cas, Talker utilise les traits A et B. Puisque A et B ont des méthodes contradictoires, ils définissent l'utilisation de smallTalk à partir du trait B et bigTalk à partir du trait A.
Aliased_Talker utilise l'opérateur as pour définir talk comme l'alias du bigTalk de B.
Modifier le contrôle d'accès de la méthode
L'utilisation de la syntaxe as peut également être utilisée pour ajuster le contrôle d'accès de la méthode.
Exemple de modification du contrôle d'accès d'une méthode
<?php trait HelloWorld { public function sayHello() { echo 'Hello World!'; } } // 修改 sayHello 的访问控制 class MyClass1 { use HelloWorld { sayHello as protected; } } // 给方法一个改变了访问控制的别名 // 原版 sayHello 的访问控制则没有发生变化 class MyClass2 { use HelloWorld { sayHello as private myPrivateHello; } } ?>
Composer des traits à partir de traits
Tout comme les classes peuvent utiliser des traits, d'autres traits peuvent également utiliser des traits. En utilisant un ou plusieurs traits lorsqu'un trait est défini, il peut combiner tout ou partie des membres d'autres traits.
Exemple de composition de traits à partir de traits
<?php trait Hello { public function sayHello() { echo 'Hello '; } } trait World { public function sayWorld() { echo 'World!'; } } trait HelloWorld { use Hello, World; } class MyHelloWorld { use HelloWorld; } $o = new MyHelloWorld(); $o->sayHello(); $o->sayWorld(); ?>
La routine ci-dessus affichera : Bonjour tout le monde !
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!