Heim  >  Artikel  >  Backend-Entwicklung  >  Wie man Merkmale in PHP verwendet

Wie man Merkmale in PHP verwendet

怪我咯
怪我咯Original
2017-07-13 14:59:421417Durchsuche

Seit PHP 5.4.0 implementiert PHP eine Code-Wiederverwendungsmethode namens Traits.

Trait ist ein Code-Wiederverwendungsmechanismus, der für Sprachen mit einfacher Vererbung wie PHP vorbereitet ist. Merkmale sollen die Einschränkungen von Sprachen mit einfacher Vererbung verringern und Entwicklern die freie Wiederverwendung von Methoden in unabhängigen Klassen innerhalb verschiedener Hierarchien ermöglichen. Die Semantik der Zusammensetzung von Merkmalen und Klassen definiert eine Möglichkeit, die Komplexität zu reduzieren und die typischen Probleme zu vermeiden, die mit herkömmlicher Mehrfachvererbung und Mixin-Klassen verbunden sind.

Eigenschaften ähneln Klassen, sind jedoch nur darauf ausgelegt, Funktionalität auf feinkörnige und konsistente Weise zu kombinieren. Kann nicht durch das Merkmal selbst instanziiert werden. Es fügt der traditionellen Vererbung eine Kombination horizontaler Funktionen hinzu; das heißt, es ist keine Vererbung zwischen mehreren Klassen in einer Anwendung erforderlich.

In diesem Artikel wird hauptsächlich die Verwendung von Merkmalen in PHP vorgestellt. Einfach ausgedrückt wird das Schlüsselwort trait in PHP verwendet, um das Problem zu lösen, dass eine Klasse die -Attribute integrieren möchte und Methode , möchte aber auch andere Basisklassenmethoden haben, und Trait wird 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();

?>

Die Ausgabeergebnisse lauten wie folgt:

study
eat
driving trait

Im obigen Beispiel erbt die Student-Klasse Person und verfügt über die Eat-Methode die Fahrmethode und die Eigenschaft 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();
?>

Die Ausgabeergebnisse lauten wie folgt:

hello student
driving from drive

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

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

use Trait1, Trait2;

Was passiert, wenn mehrere Traits Methoden oder Eigenschaften mit demselben Namen enthalten? 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:

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

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();
?>
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 ist die Methode zu ändern

Zugriffskontrolle:

Trait unterstützt abstrakte Methoden,

statische Eigenschaften und statische Methoden 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();
?>
Die Ausgabeergebnisse lauten wie folgt:

Das obige ist der detaillierte Inhalt vonWie man Merkmale in PHP verwendet. 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