Heim >Schlagzeilen >Detaillierte Erklärung und Anwendung von Trait in PHP

Detaillierte Erklärung und Anwendung von Trait in PHP

小云云
小云云Original
2017-11-04 09:40:281835Durchsuche

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:

Detaillierte Erklärung und Anwendung von Trait in PHP

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:

Detaillierte Erklärung und Anwendung von Trait in PHP

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:

Detaillierte Erklärung und Anwendung von Trait in PHP

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.


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