Cet article présente principalement l'explication détaillée de la façon d'utiliser les traits en PHP. Les amis intéressés peuvent s'y référer. J'espère qu'il sera utile à tout le monde. Pour le dire plus simplement, le mot-clé trait est utilisé en PHP pour résoudre le problème selon lequel une classe souhaite intégrer les attributs et les méthodes d'une classe de base, mais souhaite également disposer de méthodes d'autres classes de base, et les traits sont généralement utilisés conjointement. avec l'usage.
<?php trait Drive { public $carName = 'trait'; public function driving() { echo "driving {$this->carName}\n"; } } class Person { public function eat() { echo "eat\n"; } } class Student extends Person { use Drive; public function study() { echo "study\n"; } } $student = new Student(); $student->study(); $student->eat(); $student->driving(); ?>
Les résultats de sortie sont les suivants :
study eat driving trait
Dans l'exemple ci-dessus, la classe Student a la méthode eat en héritant de Person, ainsi que la méthode de conduite et l'attribut carName en combinant Drive.
S'il existe une propriété ou une méthode du même nom dans Trait, la classe de base et cette classe, laquelle sera retenue au final ?
<?php trait Drive { public function hello() { echo "hello drive\n"; } public function driving() { echo "driving from drive\n"; } } class Person { public function hello() { echo "hello person\n"; } public function driving() { echo "driving from person\n"; } } class Student extends Person { use Drive; public function hello() { echo "hello student\n"; } } $student = new Student(); $student->hello(); $student->driving(); ?>
Les résultats de sortie sont les suivants :
hello student driving from drive
Nous concluons donc : lorsqu'une méthode ou un attribut porte le même nom, la méthode de la classe actuelle remplacera la méthode du trait, et la méthode du trait remplacera la méthode de la classe de base.
Si vous souhaitez combiner plusieurs traits, séparez les noms des traits par des virgules :
use Trait1, Trait2;
Si plusieurs Traits Que se passe-t-il lorsqu'une méthode ou une propriété portant le même nom est incluse ? La réponse est que lorsque plusieurs traits combinés contiennent des propriétés ou des méthodes portant le même nom, ils doivent être explicitement déclarés pour résoudre les conflits, sinon une erreur fatale se produira.
<?php trait Trait1 { public function hello() { echo "Trait1::hello\n"; } public function hi() { echo "Trait1::hi\n"; } } trait Trait2 { public function hello() { echo "Trait2::hello\n"; } public function hi() { echo "Trait2::hi\n"; } } class Class1 { use Trait1, Trait2; } ?>
Les résultats de sortie sont les suivants :
Copier le code Le code est le suivant :
Erreur fatale PHP : la méthode Trait hello n'a pas été appliquée, car il y a des collisions avec d'autres méthodes de trait sur Class1 dans ~/php54/trait_3 .php en ligne 20
Utiliser les opérateurs placeof et as pour résoudre les conflits. Placeof utilise une méthode pour en remplacer une autre, tandis que as donne un alias à une méthode Please. voir l'utilisation spécifique. Code :
<?php trait Trait1 { public function hello() { echo "Trait1::hello\n"; } public function hi() { echo "Trait1::hi\n"; } } trait Trait2 { public function hello() { echo "Trait2::hello\n"; } public function hi() { echo "Trait2::hi\n"; } } class Class1 { use Trait1, Trait2 { Trait2::hello insteadof Trait1; Trait1::hi insteadof Trait2; } } class Class2 { use Trait1, Trait2 { Trait2::hello insteadof Trait1; Trait1::hi insteadof Trait2; Trait2::hi as hei; Trait1::hello as hehe; } } $Obj1 = new Class1(); $Obj1->hello(); $Obj1->hi(); echo "\n"; $Obj2 = new Class2(); $Obj2->hello(); $Obj2->hi(); $Obj2->hei(); $Obj2->hehe(); ?>
Le résultat de sortie est le suivant :
Trait2::hello Trait1::hi Trait2::hello Trait1::hi Trait2::hi Trait1::hello
Le mot clé as a une autre utilisation, qui est de modifier le contrôle d'accès des méthodes :
Trait peut également être combiné avec Trait. prend en charge les méthodes abstraites, les propriétés statiques et les méthodes statiques, le code de test est le suivant :
<?php trait Hello { public function sayHello() { echo "Hello\n"; } } trait World { use Hello; public function sayWorld() { echo "World\n"; } abstract public function getWorld(); public function inc() { static $c = 0; $c = $c + 1; echo "$c\n"; } public static function doSomething() { echo "Doing something\n"; } } class HelloWorld { use World; public function getWorld() { return 'get World'; } } $Obj = new HelloWorld(); $Obj->sayHello(); $Obj->sayWorld(); echo $Obj->getWorld() . "\n"; HelloWorld::doSomething(); $Obj->inc(); $Obj->inc(); ?>
Le résultat de sortie est le suivant. suit :
Hello World get World Doing something 1 2
Recommandations associées :
Attributs des Traits de PHP et utilisation de base
Réutilisation du code Étapes détaillées pour l'utilisation des Traits
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!