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

Detaillierte Erläuterung der Verwendung von Merkmalen in PHP

巴扎黑
巴扎黑Original
2017-08-13 14:09:091452Durchsuche

In diesem Artikel wird hauptsächlich die Verwendung von Merkmalen in PHP vorgestellt. Der Herausgeber findet ihn recht gut, daher werde ich ihn jetzt mit Ihnen teilen und als Referenz verwenden. Folgen wir dem Editor und werfen wir einen Blick darauf.

Vereinfacht ausgedrückt wird das Schlüsselwort trait in PHP verwendet, um das Problem zu lösen, dass eine Klasse die Attribute und Methoden einer Basisklasse integrieren möchte, dies aber auch tun möchte Eigenschaften anderer Basisklassen werden im Allgemeinen in Verbindung mit use verwendet.


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

?>

Das Ausgabeergebnis lautet wie folgt:


study
eat
driving trait

Im obigen Beispiel der Student Die Klasse erbt Person mit der Methode eat, und durch die Kombination von Drive gibt es 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?


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

Das Ausgabeergebnis ist wie folgt:


hello student
driving from drive

Daher wird geschlossen, dass wenn a Wenn eine Methode oder Eigenschaft denselben Namen hat, überschreiben die Methoden in der aktuellen Klasse die Methoden des Merkmals und die Methoden des Merkmals überschreiben die Methoden in der Basisklasse.

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


use Trait1, Trait2;

Wenn mehrere Traits Methoden oder Eigenschaften mit demselben Namen enthalten , es wird Wie? 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;
}
?>

Das Ausgabeergebnis lautet wie folgt:

Kopieren Sie den Code Der Code lautet wie folgt:


Schwerwiegender PHP-Fehler: Die Trait-Methode hello wurde nicht angewendet, da es Kollisionen mit anderen Trait-Methoden in Klasse 1 in ~/php54/trait_3.php in Zeile 20 gibt.

Verwenden Sie anstelle von und Als Operatoren zum Lösen von Konflikten dient die Verwendung einer Methode zum Ersetzen einer anderen und die Angabe eines Alias ​​für die Methode. 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();
?>

Das Ausgabeergebnis lautet wie folgt:


Trait2::hello
Trait1::hi

Trait2::hello
Trait1::hi
Trait2::hi
Trait1::hello

Das Schlüsselwort as hat eine andere Verwendung, nämlich die Zugriffskontrolle von Methoden zu ändern:

Trait kann Trait auch kombinieren und Trait unterstützt abstrakte Methoden, statische Eigenschaften und statische Methoden. Der Testcode 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();
?>

Das Ausgabeergebnis lautet wie folgt:


Hello
World
get World
Doing something
1
2

Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung der Verwendung 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