Heim > Backend-Entwicklung > PHP-Tutorial > [Modernes PHP] Kapitel 2 Neue Funktionen Drei Merkmale

[Modernes PHP] Kapitel 2 Neue Funktionen Drei Merkmale

WBOY
Freigeben: 2016-07-30 13:31:20
Original
968 Leute haben es durchsucht

Traits

Viele meiner PHP-Entwicklerfreunde wissen nicht viel über Traits, ein neues Konzept, das in PHP 5.4.0 eingeführt wurde. Merkmale sehen aus wie Schnittstellen, funktionieren aber wie Klassen. Was genau sind sie also? Es ist weder das eine noch das andere.

Ein Merkmal verfügt über eine teilweise Implementierung (z. B. Konstanten, Eigenschaften und Methoden), die in eine oder mehrere tatsächliche PHP-Klassen eingebettet werden kann. Merkmale haben zwei Aufgaben: Sie zeigen an, was eine Klasse tun kann (ähnlich einer Schnittstelle) und bieten eine modulare Implementierung (ähnlich einer Klasse).

Möglicherweise haben Sie bereits ein gewisses Verständnis für Merkmale in anderen Sprachen. Beispielsweise sind die Funktionen der Module und Mixins von Ruby den Merkmalen von PHP sehr ähnlich.

Warum sollten wir Merkmale verwenden?

Die PHP-Sprache verwendet das klassische Vererbungsmodell. Das bedeutet, dass Sie mit einer gemeinsamen Stammklasse beginnen, die die grundlegende Implementierung bereitstellt. Aus der Stammklasse werden spezifischere Klassen erstellt, die verschiedene Implementierungen der übergeordneten Klasse direkt erben. Dies wird als Vererbungshierarchie bezeichnet und viele Programmiersprachen verwenden dieses gemeinsame Muster.

Um es leichter zu verstehen, gehen wir davon aus, dass Sie in die Zeit zurückreisen, zur High School, um Biologie zu studieren. Erinnern Sie sich noch an Stamm, Ordnung, Familie, Gattung und Art der Organismen, die Sie untersucht haben? Insgesamt gibt es sechs Hauptbereiche: Der Bereich leitet sich von der Tür ab, der Stamm leitet sich von der Klasse ab, die Klasse leitet sich von der Ordnung ab, die Ordnung leitet sich von der Familie ab, die Familie leitet sich von der Gattung ab und die Auf die Gattung folgt die Art. Jeder Abstieg in der Artenhierarchie stellt ein bestimmtes Merkmal dar.

Das klassische Vererbungsmodell funktioniert in den meisten Fällen gut. Was aber, wenn es zwei unabhängige Klassen gibt, die ein ähnliches Verhalten implementieren müssen? Beispielsweise heißt eine PHP-Klasse „RetailStore“ und eine andere PHP-Klasse „Car“. Man kann sagen, dass es sich um zwei völlig unabhängige Klassen handelt, die hinsichtlich der Vererbungsbeziehung keine gemeinsame übergeordnete Klasse haben können. Allerdings benötigen beide Klassen den Längen- und Breitengrad des geografischen Standorts, um Kartenkoordinaten anzuzeigen.

Wir haben Eigenschaften erstellt, um dieses Problem zu lösen. Sie können eine teilweise Implementierung in nicht verwandte Klassen einschleusen. Merkmale erleichtern auch die Wiederverwendung von Code.

Als ich auf dieses Problem stieß, bestand meine erste (und schlechteste) Lösung darin, eine öffentliche übergeordnete Klasse Geocodable zu erstellen, die von RetailStore und Car geerbt wurde. Diese Lösung ist wirklich schlecht, da es in ihren jeweiligen Vererbungshierarchien sehr umständlich erscheint, zwei nicht verwandte Klassen dazu zu zwingen, einen gemeinsamen Vorfahren zu teilen.

Meine zweite (etwas bessere) Lösung besteht darin, eine geokodierbare Schnittstelle zu erstellen, die definiert, welche Methoden zur Implementierung der Geolokalisierung erforderlich sind. Sowohl die RetialStore- als auch die Car-Klasse können diese geokodierbare Schnittstelle implementieren. Es ist in der Tat eine gute Lösung, jeder Klasse zu ermöglichen, ihre natürliche Vererbungsbeziehung beizubehalten. Aber wir müssen die Definition in der Schnittstelle immer noch in jeder Klasse wiederholen, was keine DRY-Lösung ist.

DRY ist die Abkürzung für Don't Repeat Yourself. Als gute Programmierpraxis sollten wir niemals denselben Code an mehreren Stellen wiederholen. Es kann nicht vorkommen, dass Sie denselben Code an anderen Stellen passiv ändern müssen, weil Sie einen Code geändert haben.

Meine dritte Lösung (die beste Lösung) besteht darin, ein geokodierbares Merkmal zu erstellen und darin zugehörige Methoden zu definieren und zu implementieren. Ich kann der RetailStore-Klasse und der Car-Klasse geokodierbare Merkmale hinzufügen, ohne die Klassenvererbungshierarchie zu stören.

So konstruieren Sie ein Merkmal

Im Folgenden wird gezeigt, wie Sie ein PHP-Merkmal definieren:

<?php
trait MyTrait {
    // 此处是trait的具体实现
}
Nach dem Login kopieren

Aus guter Angewohnheit sollten wir ein Trait pro Datei erstellen, genau wie die Definition von Klassen und Schnittstellen.

Kehren wir zu unserem Geocodable-Beispiel zurück, um die Verwendung von Merkmalen besser zu demonstrieren. Wir alle wissen, dass die RetailStore-Klasse und die Car-Klasse die geografische Positionierungsfunktion unterstützen müssen, und wir sind uns alle einig, dass Vererbung und Schnittstellen nicht die beste Lösung sind. Stattdessen erstellen wir ein geokodierbares Merkmal, das eine Längen- und Breitengradkoordinate zurückgibt, die auf einer Karte markiert werden kann. Beispiel 2-12 zeigt unser vollständiges Geocodable-Merkmal.

Beispiel 2-12 Definition eines geokodierbaren Merkmals

<span style="font-size:14px;"><?php
trait Geocodable {
    /** @var string */
    protected $address;

    /** @var \Geocoder\Geocoder */
    protected $geocoder;

    /** @var \Geocoder\Result\Geocoded */
    protected $geocoderResult;

    public function setGeocoder(\Geocoder\GeocoderInterface $geocoder)
    {
        $this->geocoder = $geocoder;
    }

    public function setAddress($address)
    {
        $this->address = $address;
    }

    public function getLatitude()
    {
        if (isset($this->geocoderResult) === false) {
            $this->geocodeAddress();
        }

        return $this->geocoderResult->getLatitude();
    }

    public function getLongitude()
    {
        if (isset($this->geocoderResult) === false) {
            $this->geocodeAddress();
        }

        return $this->geocoderResult->getLongitude();
    }

    protected function geocodeAddress()
    {
        $this->geocoderResult = $this->geocoder->geocode($this->address);

        return true;
    }
}</span>
Nach dem Login kopieren

Geokodierbares Merkmal ist Es werden nur die Eigenschaften und Methoden definiert, die zur Implementierung der geografischen Standortfunktion erforderlich sind, ohne dass zusätzliche Funktionen erforderlich sind.

Unser geokodierbares Merkmal definiert Eigenschaften von drei Klassen:

Fortsetzung folgt...

Das Obige stellt [Modernes PHP] in Kapitel 2 mit drei neuen Funktionen vor, einschließlich Aspekten des Inhalts. Ich hoffe, dass es für Freunde hilfreich sein wird, die sich für PHP-Tutorials interessieren.

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage