Pour faire simple, le mot-clé trait est utilisé en PHP pour résoudre le problème selon lequel une classe veut intégrer les propriétés et méthodes d'une classe de base, mais veut également avoir d'autres méthodes de classes de base, et le trait est généralement utilisé en conjonction avec use.
<?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(); ?>
Le résultat de sortie est le suivant :
study eat driving trait
Dans l'exemple ci-dessus, la classe Student hérite de Person via , a la méthode eat , et combine Drive avec la méthode de conduite et l'attribut carName.
S'il y a une propriété ou méthode du même nom dans Trait, 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
Il est donc conclu que lorsqu'une méthode ou un attribut porte le même nom, la méthode de la classe actuelle remplacera le trait méthode, et la méthode du trait remplacera les méthodes de la classe de base.
Si vous souhaitez combiner plusieurs Traits, séparez les noms des Traits par des virgules :
use Trait1, Trait2;
Que se passe-t-il si plusieurs Traits contiennent des méthodes ou des propriétés portant le même nom ? 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; } ?>
Le résultat de sortie est le suivant :
Le code est le suivant :
PHP Fatal error: Trait method hello has not been applied, because there are collisions with other trait methods on Class1 in ~/php54/trait_3.php on line 20
Utiliser à la place de et commeopérateur pour résoudre conflits, au lieu de est utilisé. Une méthode en remplace une autre, et tout comme un alias pour la méthode. Veuillez consulter le code pour une utilisation spécifique :
<?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(); ?>
Les résultats de sortie sont les suivants :
Trait2::hello Trait1::hi Trait2::hello Trait1::hi Trait2::hi Trait1::hello
contrôle d'accès de la méthode :
Trait peut également être combiné avec Trait prend en charge les méthodes abstraites,static<🎜. > attributs et méthodes statiques. Le code du test est le suivant :
Le résultat de sortie 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(); ?>
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!