Maison > Article > développement back-end > Résumé de l'utilisation des traits en PHP
PHP est un seul héritage langage. Avant l'apparition de PHP 5.4 Traits, les classes PHP ne pouvaient pas hériter des propriétés ou des méthodes de deux classes de base en même temps. La fonction de combinaison des Traits de PHP est similaire à celle du langage Go. Vous utilisez le mot-clé use dans la classe pour déclarer le nom du Trait à combiner. Cependant, la déclaration d'un Trait spécifique utilise le mot-clé trait, et le Trait. ne peut pas être instancié directement. Veuillez consulter le code ci-dessous pour une utilisation spécifique :
<?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 et a le méthode eat. En combinant Drive, nous avons 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 ? Testez-le avec le code suivant :
<?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();
Le résultat de sortie est le suivant :
hello student driving from drive
Par conséquent, on conclut que lorsqu'une méthode ou un attribut a le même nom, la méthode dans la classe actuelle remplacera les méthodes de trait, et les méthodes de trait remplaceront les méthodes de la classe de base.
Si vous souhaitez combiner plusieurs traits, séparez les noms des traits par des virgules :
utilisez Trait1, Trait2 ;
Si plusieurs traits contiennent des méthodes ou des propriétés avec le même nom, que va-t-il se passer ? 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 :
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 en tant queopérateurs pour résoudre les conflits au lieu de utilise une méthode pour en remplacer une autre, et comme. Il s'agit de donner un alias à 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();
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 consiste à modifier la méthodeContrôle d'accès :
<?php trait Hello { public function hello() { echo "hello,trait\n"; } } class Class1 { use Hello { hello as protected; } } class Class2 { use Hello { Hello::hello as private hi; } } $Obj1 = new Class1(); $Obj1->hello(); # 报致命错误,因为hello方法被修改成受保护的 $Obj2 = new Class2(); $Obj2->hello(); # 原来的hello方法仍然是公共的 $Obj2->hi(); # 报致命错误,因为别名hi方法被修改成私有的
Trait peut également être combiné avec Trait. Trait prend en charge les méthodes abstraites, les propriétés statiques et les méthodes statiques. le code 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();
Les résultats de sortie sont les suivants :
Hello World get World Doing something 1 2
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!