Heim >Backend-Entwicklung >PHP-Tutorial >So verwenden Sie Merkmale, um die Wiederverwendung von PHP-Code zu erreichen

So verwenden Sie Merkmale, um die Wiederverwendung von PHP-Code zu erreichen

伊谢尔伦
伊谢尔伦Original
2017-07-03 11:27:381392Durchsuche

In diesem Artikel werden hauptsächlich Beispiele für die Verwendung von Merkmalen zur Implementierung der Code-Wiederverwendung in PHP vorgestellt. In diesem Artikel wird die einfache Verwendung von Merkmalen, Prioritätsproblemen, Problemen mit mehreren Merkmalskonflikten und wie sie zum Ändern von Zugriffskontrolle, die Verwendung von Trait in Trait usw. Freunde, die es benötigen, können sich auf

Die neuen Traits beziehen, die nach PHP5.4 hinzugefügt wurden, um den Code-Wiederverwendungsmechanismus zu implementieren, aber Sie können nicht instanziiert werden. Verwenden Sie einfach das Schlüsselwort use, um es in die Klasse einzuführen, getrennt durch „,“.

(1) Trait ist einfach zu verwenden

<?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()

(2) Prioritätsproblem Trait überschreibt derzeit geerbte Methoden Die Klasse überschreibt die Trait-Methode.

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()

(3) Probleme mit mehreren Merkmalskonflikten Wenn der Konflikt nicht gelöst wird, tritt ein schwerwiegender Fehler auf
Sie können stattdessen verwenden, um zu klären, welche Methode in der zu verwendende Konflikt;
Sie können den as
-Operator verwenden, um eine der widersprüchlichen Methoden

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另起名

(4) umzubenennen, die zum Ändern der Methode verwendet werden können Zugriffskontrolle

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;

(5) Trait wird in 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

verwendet (6) Trait unterstützt abstrakte Methoden, unterstützt statische Methoden und können statische Variablen nicht direkt definieren, aber statische Variablen können durch Merkmalsmethoden referenziert werden.

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

(7) Merkmale können Attribute definieren, aber Attribute mit demselben Namen können nicht in Klassen

definiert werden

Das obige ist der detaillierte Inhalt vonSo verwenden Sie Merkmale, um die Wiederverwendung von PHP-Code zu erreichen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn