Zusammenfassung der Verwendung von Traits in PHP

伊谢尔伦
Freigeben: 2023-03-12 13:36:01
Original
1067 Leute haben es durchsucht

PHP ist eine einzelne Vererbungssprache . Bevor PHP 5.4 Traits erschien, konnten PHP-Klassen nicht gleichzeitig Eigenschaften oder Methoden von zwei Basisklassen erben. Die Kombinationsfunktion der Merkmale von PHP ähnelt der der Go-Sprache. Der Name des zu kombinierenden Merkmals wird mithilfe des Schlüsselworts „use“ in der Klasse deklariert. Die Deklaration eines bestimmten Merkmals verwendet jedoch das Schlüsselwort „trait“, und das Merkmal kann nicht verwendet werden direkt instanziiert werden. Informationen zur spezifischen Verwendung finden Sie im folgenden Code:

<?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();
Nach dem Login kopieren

Das Ausgabeergebnis lautet wie folgt:

study
eat
driving trait
Nach dem Login kopieren

Im obigen Beispiel erbt die Student-Klasse Person und hat die Wenn wir Drive kombinieren, haben wir die Fahrmethode und das Attribut carName.

Wenn es in Trait, Basisklasse und dieser Klasse eine Eigenschaft oder Methode mit demselben Namen gibt, welche wird am Ende beibehalten? Testen Sie es mit dem folgenden Code:

<?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();
Nach dem Login kopieren

Das Ausgabeergebnis lautet wie folgt:

hello student
driving from drive
Nach dem Login kopieren

Daher wird der Schluss gezogen, dass, wenn eine Methode oder ein Attribut denselben Namen hat, die Methode in der aktuellen Klasse überschreibt die Trait-Methode und die Trait-Methode überschreibt die Methode in der Basisklasse.

Wenn Sie mehrere Traits kombinieren möchten, trennen Sie die Trait-Namen durch Kommas:

verwenden Sie Trait1, Trait2;

Wenn mehrere Traits Methoden oder Eigenschaften mit dem enthalten gleicher Name, was wird passieren? Die Antwort lautet: Wenn mehrere kombinierte Merkmale Eigenschaften oder Methoden mit demselben Namen enthalten, müssen diese explizit deklariert werden, um Konflikte zu lösen, da andernfalls ein schwerwiegender Fehler auftritt.

<?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;
}
Nach dem Login kopieren

Die Ausgabeergebnisse lauten wie folgt:

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
Nach dem Login kopieren

Verwenden Sie die Operatoren „Stattstatt“ und „As“, um Konflikte zu lösen. Statt verwendet eine Methode, um eine andere zu ersetzen, und „As“. Es dient dazu, der Methode einen Alias ​​zu geben. Informationen zur spezifischen Verwendung finden Sie im Code:

<?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();
Nach dem Login kopieren
Das Ausgabeergebnis lautet wie folgt:

Trait2::hello
Trait1::hi

Trait2::hello
Trait1::hi
Trait2::hi
Trait1::hello
Nach dem Login kopieren
Das Schlüsselwort as hat eine andere Verwendung ist die Methode zu ändern

Zugriffskontrolle:

<?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方法被修改成私有的
Nach dem Login kopieren
Trait unterstützt abstrakte Methoden,

statische Eigenschaften und statische Methoden Der Code lautet wie folgt:

<?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();
Nach dem Login kopieren
Die Ausgabeergebnisse lauten wie folgt:

Das obige ist der detaillierte Inhalt vonZusammenfassung der Verwendung von Traits in PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage