1. Vererbung vs. Polymorphismus vs. Merkmal
Es gibt jetzt zwei Klassen: Publish.php und Answer.php. Um die LOG-Funktion hinzuzufügen, zeichnen Sie die Aktionen innerhalb der Klasse auf. Es gibt mehrere Möglichkeiten:
Vererbung des polymorphen Merkmals 1.1.
wie in der Abbildung gezeigt:
Code Die Struktur ist wie folgt:
// Log.php
Sie können sehen, dass die Vererbung tatsächlich die Anforderungen erfüllt. Dies verstößt jedoch gegen das objektorientierte Prinzip. Die Beziehung zwischen Vorgängen wie „Veröffentlichen“, „Antworten“ und „Protokollieren“ ist nicht die Beziehung zwischen der Unterklasse und der übergeordneten Klasse. Es wird daher nicht empfohlen, es auf diese Weise zu verwenden.
1.2. Polymorphismus
Wie gezeigt:
Implementierungscode:
// Log.php
Die Protokollierungsvorgänge sollten gleich sein, daher ist auch die Protokollierungsimplementierung in den Aktionen „Veröffentlichen“ und „Antworten“ identisch. Offensichtlich verstößt dies gegen das DRY-Prinzip (Don’t Repeat Yourself). Daher wird die Implementierung auf diese Weise nicht empfohlen.
1.3. Merkmal
wie gezeigt:
Der Implementierungscode ist wie folgt folgt:
// Log.php endLog(); // Answer.php startLog();
Wie Sie sehen können, haben wir den Code erreicht, ohne die Komplexität zu erhöhen den Code wiederverwenden.
1.4. Fazit
Obwohl die Vererbungsmethode das Problem auch lösen kann, verstößt ihre Idee gegen das objektorientierte Prinzip und scheint sehr grob zu sein. Die polymorphe Methode ist jedoch nicht konsistent bei der Softwareentwicklung erhöht das DRY-Prinzip die Wartungskosten. Die Trait-Methode vermeidet die oben genannten Mängel und erreicht die Wiederverwendung von Code relativ elegant.
2. Umfang von Trait
Nachdem wir die Vorteile von Trait verstanden haben, müssen wir zuerst über den Umfang sprechen. Dies ist einfacher zu beweisen:
publicF(); (); $ this->privateF(); } } $publish = new Publish();
Die Ausgabe des obigen Codes ist wie folgt:
öffentliche Funktion, geschützte Funktion, private Funktion
Es kann festgestellt werden, dass der Umfang von Trait innerhalb der Trait-Klasse sichtbar ist, die darauf verweist. Es versteht sich, dass das Schlüsselwort use den Implementierungscode des Merkmals in die Klasse kopiert, die auf das Merkmal verweist.
3. Priorität der Attribute in Trait
Wenn es um die Priorität geht, muss es ein Referenzobjekt zum Vergleich geben. Das Referenzobjekt bezieht sich hier auf die Trait-Klasse und ihre übergeordnete Klasse.
Verwenden Sie den folgenden Code, um die Priorität von Attributen in der Trait-Anwendung zu beweisen:
protectF(); } } $publish = new Publish(); $publish->doPublish();
Die Ausgabe des obigen Codes ist wie folgt:
Publish:: publicF public function Log::protectF protected function
Durch das obige Beispiel können die Prioritäten in Trait-Anwendungen wie folgt zusammengefasst werden:
Mitglieder aus der aktuellen Klasse überschreiben die Methode des Traits und des Das Merkmal überschreibt das geerbte. Methode
Klassenmitgliedspriorität ist: aktuelle Klasse>Merkmal>4. Anstelle von und As-Schlüsselwörtern können mehrere Merkmale in einer Klasse referenziert werden , wie folgt:
startLog(); ; parameterCheck($para); $this->endLog(); }
Durch die obige Methode können wir auf mehrere Merkmale in einer Klasse verweisen. Beim Verweisen auf mehrere Merkmale kann es leicht zu Problemen kommen. Das häufigste Problem ist, was zu tun ist, wenn in zwei Merkmalen Eigenschaften oder Methoden mit demselben Namen vorhanden sind. Zu diesem Zeitpunkt müssen die Schlüsselwörter anstelle von und verwendet werden den folgenden Implementierungscode:
?php trait Log { public function parameterCheck($parameters) { echo __METHOD__ } public function startLog() { echo __METHOD__ } . trait Check { public function parameterCheck($parameters) { echo __METHOD__ } public function startLog() { echo __METHOD__ } Publish { use Check, Log { Check::parameterCheck statt Log; Log::startLog as csl } public function doPublish() { $this->parameterCheck('params' ); $this->csl(); } } $publish = new Publish();
Führen Sie den obigen Code aus, das Ausgabeergebnis ist wie folgt:
Log: :startLog öffentliche Funktion Check::parameterCheck Parameter checkparams Check::startLog öffentliche Funktion
Genau wie die wörtliche Bedeutung ersetzt das Schlüsselwort „statten“ Letzteres durch Ersteres und das Schlüsselwort „as“ gibt an Alias für die ersetzte Methode.
Bei der Referenzierung von Trait wird das Schlüsselwort use verwendet, um auf den Namespace zu verweisen. Der Unterschied zwischen den beiden besteht darin, dass Trait beim Verweisen innerhalb der Klasse verwendet wird.