Heim >Backend-Entwicklung >PHP-Tutorial >Detaillierte Grafik- und Texterklärung zur Anwendung von Merkmalen in PHP
Ab PHP-Version 5.4.0 bietet PHP ein neues Konzept der Code-Wiederverwendung, nämlich Trait. Trait bedeutet wörtlich „Merkmale“ und „Merkmale“. Wir können verstehen, dass die Verwendung des Schlüsselworts Trait den Klassen in PHP neue Merkmale hinzufügen kann.
Jeder, der mit objektorientiert vertraut ist, weiß, dass es zwei Methoden der Code-Wiederverwendung gibt, die häufig in der Softwareentwicklung verwendet werden: Vererbung und Polymorphismus. In PHP kann nur eine einzelne Vererbung erreicht werden. Eigenschaften vermeiden dies. Das Folgende ist eine vergleichende Erklärung anhand eines einfachen Beispiels.
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
Polymorphismus
Merkmal
1.1. Erben
Wie in der Abbildung gezeigt:
Die Codestruktur ist wie folgt folgt:
// Log.php <?php Class Log { public function startLog() { // echo ... } public function endLog() { // echo ... } }
// Publish.php <?php Class Publish extends Log { } // Answer.php <?php Class Answer extends Log { }
Sie sehen, dass die Vererbung den Anforderungen entspricht. 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 <?php Interface Log { public function startLog(); public function endLog(); }
// Publish.php <?php Class Publish implements Log { public function startLog() { // TODO: Implement startLog() method. } public function endLog() { // TODO: Implement endLog() method. } }
// Answer.php <?php Class Answer implements Log { public function startLog() { // TODO: Implement startLog() method. } public function endLog() { // TODO: Implement endLog() method. } }
Die Protokollierungsvorgänge sollten gleich sein, daher ist die Protokollierungsimplementierung in den Aktionen „Veröffentlichen“ und „Antworten“ dasselbe. 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 lautet wie folgt:
// Log.php <?php trait Log{ public function startLog() { // echo .. } public function endLog() { // echo .. } }
// Publish.php <?php class Publish { use Log; } $publish = new Publish(); $publish->startLog(); $publish->endLog();
// Answer.php <?php class Answer { use Log; } $answer = new Answer(); $answer->startLog(); $answer->endLog();
Wie Sie sehen können, haben wir die Wiederverwendung von Code erreicht, ohne die Komplexität des Codes zu erhöhen.
1.4. Fazit
Obwohl Vererbung das Problem auch lösen kann, widerspricht ihre Idee dem objektorientierten Ansatz Das Prinzip erscheint sehr grob; die polymorphe Methode ist ebenfalls machbar, entspricht jedoch nicht dem DRY-Prinzip in der Softwareentwicklung und erhöht die Wartungskosten. Die Trait-Methode vermeidet die oben genannten Mängel und erreicht die Wiederverwendung von Code relativ elegant.
2. Umfang von Trait
<?php class Publish { use Log; public function doPublish() { $this->publicF(); $this->protectF(); $this->privateF(); } } $publish = new Publish(); $publish->doPublish();Das Ausgabeergebnis der Ausführung des obigen Codes lautet wie folgt:
öffentliche Funktiongeschützte Funktion
private Funktion
3. Die Priorität des Attributs in Trait
<?php trait Log { public function publicF() { echo METHOD . ' public function' . PHP_EOL; } protected function protectF() { echo METHOD . ' protected function' . PHP_EOL; } } class Question { public function publicF() { echo METHOD . ' public function' . PHP_EOL; } protected function protectF() { echo METHOD . ' protected function' . PHP_EOL; } } class Publish extends Question { use Log; public function publicF() { echo METHOD . ' public function' . PHP_EOL; } public function doPublish() { $this->publicF(); $this->protectF(); } } $publish = new Publish(); $publish->doPublish();Die Ausgabe des obigen Codes lautet wie folgt:
Veröffentlichen ::publicF öffentliche FunktionLog::protectF geschützte Funktion
1. Mitglieder der aktuellen Klasse überschreiben die Trait-Methode
2. Trait überschreibt die geerbte Methode
4. Statt- und As-Schlüsselwörter
<?php trait Log { public function startLog() { echo METHOD . ' public function' . PHP_EOL; } protected function endLog() { echo METHOD . ' protected function' . PHP_EOL; } } trait Check { public function parameterCheck($parameters) { // do sth } } class Publish extends Question { use Log,Check; public function doPublish($para) { $this->startLog(); $this->parameterCheck($para); $this->endLog(); } }Durch das oben Gesagte Auf diese Weise können wir auf mehrere Merkmale in einer Klasse verweisen. Beim Verweisen auf mehrere Merkmale kann es leicht zu Problemen kommen. Was ist zu tun, wenn in zwei Merkmalen Eigenschaften oder Methoden mit demselben Namen vorhanden sind? Siehe den folgenden Implementierungscode:
<?php trait Log { public function parameterCheck($parameters) { echo METHOD . ' parameter check' . $parameters . PHP_EOL; } public function startLog() { echo METHOD . ' public function' . PHP_EOL; } } trait Check { public function parameterCheck($parameters) { echo METHOD . ' parameter check' . $parameters . PHP_EOL; } public function startLog() { echo METHOD . ' public function' . PHP_EOL; } } class Publish { use Check, Log { Check::parameterCheck insteadof Log; Log::startLog insteadof Check; Check::startLog as csl; } public function doPublish() { $this->startLog(); $this->parameterCheck('params'); $this->csl(); } } $publish = new Publish(); $publish->doPublish();Führen Sie den obigen Code aus. Das Ausgabeergebnis lautet wie folgt:
Log::startLog öffentliche FunktionCheck::parameterCheck-Parameter checkparams
Check::startLog öffentliche Funktion
Genau wie die wörtliche Bedeutung ersetzt das Schlüsselwort Insteadof letzteres durch ersteres und das Schlüsselwort as gibt der ersetzten Methode einen Alias.
verwendet das Schlüsselwort „use“, wenn auf Trait verwiesen wird. Das Schlüsselwort „use“ wird auch verwendet, um auf den Namespace zu verweisen. Der Unterschied zwischen den beiden besteht darin, dass Trait beim Verweisen innerhalb der Klasse verwendet wird.
Das obige ist der detaillierte Inhalt vonDetaillierte Grafik- und Texterklärung zur Anwendung von Merkmalen in PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!