Heim  >  Artikel  >  Backend-Entwicklung  >  Detaillierte Erläuterung der Verwendung des Mechanismus zur Wiederverwendung von Merkmalen in PHP

Detaillierte Erläuterung der Verwendung des Mechanismus zur Wiederverwendung von Merkmalen in PHP

黄舟
黄舟Original
2017-09-08 09:37:411491Durchsuche

Wenn es um die Wiederverwendung von Code in PHP geht, denken wir möglicherweise zunächst an Vererbung. Sobald diese einzelne Vererbungssprache jedoch zu viele Unterklassen ableitet, führt dies zu einer Reihe von Problemen, z. B. zu übermäßiger Abhängigkeit von übergeordneten Klassen Kopplung groß, wodurch die Kapselung der Klasse zerstört wird. Gibt es also einen besseren Weg, die Wiederverwendung von Code zu erreichen?

Seit PHP 5.4.0 hat PHP eine weitere Methode zur Code-Wiederverwendung namens Traits implementiert.

Traits ist ein Code-Wiederverwendungsmechanismus für Sprachen mit einfacher Vererbung wie PHP. Merkmale sollen die Einschränkungen von Sprachen mit einfacher Vererbung verringern und Entwicklern die freie Wiederverwendung von Methodensätzen in unabhängigen Klassen innerhalb verschiedener Hierarchien ermöglichen. Die Semantik von Merkmalen und die Klassenzusammensetzung definieren eine Möglichkeit, die Komplexität zu reduzieren und die typischen Probleme zu vermeiden, die mit traditioneller Mehrfachvererbung und Mixins verbunden sind.

Grundlegende Verwendung

Die Verwendung von Traits ist sehr einfach, verwenden Sie einfach das Schlüsselwort use in der Klasse.

trait A {    public function test() {
        echo 'trait A::test()';
    }
}class b {
    use A;
}$b=new b();$b->test();

Priorität

Einfach ausgedrückt ist die Trait-Priorität höher als die Methode der übergeordneten Klasse, aber niedriger als die Methode der aktuellen Klasse.

trait A {    public function test() {
        echo 'trait A::test()';
    }    public function test1() {
        echo 'trait A::test1()';
    }    
}class base{
    public function test(){
        echo 'base::test()';
    }    public function test1(){
        echo 'base::test1()';
    }    
}class b extends base{
    use A;    public function test(){
        echo 'b::test()';
    }
}$b=new b();$b->test();//b::test()$b->test1();//trait A::test1()

Trait-Konfliktproblem

Wenn mehrere Traits verwendet werden und derselbe Methodenname vorhanden ist, tritt ein Konflikt auf. Verwenden Sie „statt“ und „as“, um das Problem des Methodennamenkonflikts zu lösen.

statt kann eine bestimmte Methode mit zwei identischen Methodennamen deklarieren.

trait A {    public function test() {
        echo 'trait A::test()';
    } 
}trait B {    public function test() {
        echo 'trait B::test()';
    } 
}class c{
    use A,B{        A::test insteadof B;//使用 insteadof 明确使用哪个方法
        B::test as testB;//使用 as 修改另外一个方法名称,必须在使用 insteadof 解决冲突后使用
    }
}$c=new c();$c->test();//trait A::test()$c->testB();//trait B::test()

Methodenzugriffskontrolle

Mit dem Schlüsselwort as können wir die Zugriffsberechtigungen der Trait-Methode ändern

trait A {    public function test() {
        echo 'trait A::test()';
    } 
    private function test1(){
        echo 'trait A::test1()';
    }
}class b{
    use A{        test as protected;
        test1 as public test2;//更改权限时还可以修改名称
    }
}$b=new b();$b->test();//Fatal error: Call to protected method b::test()$b->test2();//trait A::test1()

Nutzung der Trait-Verschachtelung

 trait A {        public function test1() {
            echo 'test1';
        }
    }    trait B {        public function test2() {
            echo 'test2';
        }
    }    trait C {        use A,B;
    }    class D {
        use C;
    }    $d = new D();    $d->test2();  //test2

Variable, Attribut, Methodendefinition

Trait kann Attribute definieren, aber das gleichnamige Attribut kann nicht in der Klasse definiert werden

 trait A {       
 public $test1;
    }    class B {
        use A;        
        public $test;        
        public $test1;//Strict Standards: B and A define the same property ($test1) in the composition of B...
    }

Trait unterstützt abstrakte Methoden und statische Methoden und kann dies nicht direkt sein Definieren Sie statische Variablen, 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

Vergleich mit Javascript

Die Verwendungsmethode dieser Merkmalsverwendung ähnelt wahrscheinlich etwas dem Aufruf in Javascript, bei dem ein anderes Objekt in die Ausführungsumgebung des aktuellen Objekts eingebunden wird. Natürlich ist Javascript eine prototypbasierte Sprache. Es gibt keinen Vergleich zwischen den beiden. Es ist nur so, dass die Verwendungsmethoden fast gleich sind, was zum Verständnis beiträgt.

function a() {
    this.name="a";    this.getName=function(){
        console.log(this.name);
    }
}function b(){
    this.name="b";
    a.call(this);
}var b = new b();     
b.getName();//a

Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung der Verwendung des Mechanismus zur Wiederverwendung von Merkmalen in PHP. 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