Explication détaillée de l'utilisation des traits en PHP

巴扎黑
Libérer: 2023-03-15 06:38:01
original
1447 Les gens l'ont consulté

Cet article présente principalement comment utiliser les traits en PHP. L'éditeur pense que c'est plutôt bien, je vais donc le partager avec vous maintenant et le donner comme référence. Suivons l'éditeur et jetons un coup d'œil.

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 attributs et les méthodes d'une classe de base, mais veut également ont des méthodes d'autres classes de base. Les traits sont généralement utilisés en conjonction avec l'utilisation.


<?php
  trait Drive {
    public $carName = &#39;trait&#39;;
    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();

?>
Copier après la connexion

Le résultat de sortie est le suivant :


study
eat
driving trait
Copier après la connexion

Dans l'exemple ci-dessus, l'étudiant La classe hérite de Person , avec la méthode eat, et en combinant Drive, il y a 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();
?>
Copier après la connexion

Le résultat de sortie est le suivant :


hello student
driving from drive
Copier après la connexion

Par conséquent, il est conclu que lorsqu'un méthode ou propriété a le même nom, les méthodes de la classe actuelle remplaceront les méthodes du trait et les méthodes du 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 :


use Trait1, Trait2;
Copier après la connexion

Si plusieurs traits contiennent des méthodes ou des propriétés portant le même nom , ça va Comment ? 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;
}
?>
Copier après la connexion

Le résultat de sortie est le suivant :

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 à la ligne 20

Utiliser à la place de et en tant qu'opérateurs pour résoudre les conflits, Au lieu de cela, il faut utiliser une méthode pour en remplacer une autre, et ainsi 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();
?>
Copier après la connexion
<. 🎜>Le résultat de sortie est le suivant :


Trait2::hello
Trait1::hi

Trait2::hello
Trait1::hi
Trait2::hi
Trait1::hello
Copier après la connexion
Le mot-clé as a une autre utilisation, qui est de modifier le contrôle d'accès des méthodes :

Trait peut également combiner Trait, et 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 &#39;get World&#39;;
  }
}
$Obj = new HelloWorld();
$Obj->sayHello();
$Obj->sayWorld();
echo $Obj->getWorld() . "\n";
HelloWorld::doSomething();
$Obj->inc();
$Obj->inc();
?>
Copier après la connexion
Le résultat de sortie est le suivant :


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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!