Heim >Backend-Entwicklung >PHP-Tutorial >Detaillierte Grafik- und Texterklärung zur Verwendung von Merkmalen in PHP

Detaillierte Grafik- und Texterklärung zur Verwendung von Merkmalen in PHP

墨辰丷
墨辰丷Original
2018-05-22 14:18:321384Durchsuche

In diesem Artikel wird hauptsächlich die Verwendung von Merkmalen in PHP ausführlich erläutert. Ich hoffe, dass er für alle hilfreich ist. Einfacher 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, aber auch Methoden anderer Basisklassen haben möchte, und Merkmale werden im Allgemeinen in Verbindung verwendet mit Gebrauch.


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

?>


Die Ausgabeergebnisse lauten wie folgt:


study
eat
driving trait


Im obigen Beispiel verfügt die Student-Klasse über die Eat-Methode durch Vererbung von Person und die Fahrmethode und das Attribut carName durch Kombination von Drive.

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


Die Ausgabeergebnisse lauten wie folgt:


hello student
driving from drive


Die Schlussfolgerung lautet also: Wenn eine Methode oder ein Attribut denselben Namen hat, überschreibt die Methode in der aktuellen Klasse die Methode des Merkmals und die Methode des Merkmals überschreibt die Methode in der Basisklasse.

Wenn Sie mehrere Merkmale kombinieren möchten, trennen Sie die Merkmalsnamen durch Kommas:


use Trait1, Trait2;


Wenn mehrere Merkmale enthalten Was passiert, wenn die Methode oder Eigenschaft denselben Namen hat? 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;
}
?>


Die Ausgabeergebnisse lauten wie folgt:


Code kopieren Der Code lautet wie folgt:


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


Verwenden Sie die Operatoren „sstatt“ und „as“, um Konflikte zu lösen, während „as“ der Methode einen Alias ​​verleiht Code für spezifische Verwendung:


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


Die Ausgabeergebnisse lauten 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 der Methode zu ändern:

Trait kann auch mit Trait kombiniert werden, das abstrakte Methoden unterstützt, statisch Attribute 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


Verwandte Empfehlungen:

[php-Klassen und -Objekte]Trait

php Traits-Attribute und grundlegende Verwendung

Detaillierte Schritte zur Verwendung von Code-Wiederverwendungsmerkmalen

Das obige ist der detaillierte Inhalt vonDetaillierte Grafik- und Texterklärung zur 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