Comment utiliser les traits pour réaliser la réutilisation du code PHP

伊谢尔伦
Libérer: 2023-03-12 13:40:02
original
1357 Les gens l'ont consulté

Cet article présente principalement des exemples d'utilisation de traits pour implémenter la réutilisation de code en PHP. Cet article explique l'utilisation simple des traits, les problèmes de priorité, les problèmes de conflit de traits multiples et comment ils peuvent être utilisés pour modifier <.>Contrôle d'accès, utilisation de Trait dans Trait, etc. Les amis qui en ont besoin peuvent se référer à

Les nouveaux traits ajoutés après PHP5.4 implémentent le mécanisme de réutilisation de code. Les traits sont similaires aux classes, mais. ils ne peuvent pas être instanciés. Il n'est pas nécessaire d'hériter, il suffit d'utiliser le mot-clé use pour l'introduire dans la classe. Plusieurs traits peuvent être introduits, séparés par ','.

(1) Le trait est simple à utiliser

<?php
 
trait A {
  public $var1 = &#39;test1&#39;;
  public function test1() {
    echo &#39;trait A::test1()&#39;;
  }
}
 
trait B {
  public $var2 = &#39;test2&#39;;
  public function test2() {
    echo &#39;trait B::test2()&#39;;
  }
}
 
class C {
  use A,B;
}
 
$c = new C();
echo $c->var1; //test1
$c->test2(); //trait B::test2()
Copier après la connexion

(2) Problème prioritaire Le trait remplacera actuellement les méthodes héritées. La classe remplacera la méthode Trait.

trait A {
  public $var1 = &#39;test&#39;;
  public function test() {
    echo &#39;A::test()&#39;;
  }
  public function test1() {
    echo &#39;A::test1()&#39;;
  }
}
 
class B {
  public function test() {
    echo &#39;B::test()&#39;;
  }
  public function test1() {
    echo &#39;B::test1()&#39;;
  }
}
class C extends B{
  use A;
  public function test() {
    echo &#39;c::test()&#39;;
  }
}
 
$c = new C();
$c->test(); //c::test()
$c->test1(); //A::test1()
Copier après la connexion

(3) Problèmes de conflit de traits multiples Si le conflit n'est pas résolu, une erreur fatale se produira
Vous pouvez utiliser à la place pour clarifier la méthode utilisée ; le conflit à utiliser ;
Vous pouvez utiliser l'opérateur as
pour renommer l'une des méthodes en conflit

trait A {
  public function test() {
    echo &#39;A::test()&#39;;
  }
}
 
trait B {
  public function test() {
    echo &#39;B::test()&#39;;
  }
}
 
class C {
  use A,B {
    B::test insteadof A;
    B::test as t;
  }
}
 
$c = new C();
$c->test(); //B::test()
$c->t(); //B::test()  可以用as另起名
Copier après la connexion

(4) comme peut être utilisé pour modifier la méthode ; contrôle d'accès

trait HelloWorld {
  public function sayHello () {
    echo &#39;Hello World!&#39; ;
  }
}
 
// 修改 sayHello 的访问控制
class A {
  use HelloWorld { sayHello as protected; }
}
 
// 给方法一个改变了访问控制的别名
// 原版 sayHello 的访问控制则没有发生变化
class B {
  use HelloWorld { sayHello as private myPrivateHello ; }
}
 
$b = new A();
$b->sayHello(); //Fatal error: Call to protected method A::sayHello() from context &#39;&#39;
Copier après la connexion

(5) Trait est utilisé dans Trait

trait A {
  public function test1() {
    echo &#39;test1&#39;;
  }
}
 
trait B {
  public function test2() {
    echo &#39;test2&#39;;
  }
}
 
trait C {
  use A,B;
}
 
class D {
  use C;
}
 
$d = new D();
$d->test2(); //test2
Copier après la connexion

(6) Trait prend en charge les méthodes abstraites, prend en charge méthodes statiques , et ne peut pas définir directement des variables statiques, mais les variables statiques peuvent être référencées par des méthodes de trait .

trait A {
  public function test1() {
    static $a = 0;
    $a++;
    echo $a;
  }
 
  abstract public function test2(); //可定义抽象方法
}
 
class B {
  use A;
  public function test2() {
 
  }
}
 
$b = new B();
$b->test1(); //1
$b->test1(); //2
Copier après la connexion

(7) Les traits peuvent définir des attributs, mais les attributs portant le même nom ne peuvent pas être définis dans les classes

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!