Was sind die Vorteile, wenn ich die abstrakte Klasse in PHP verwende? [duplicate]

Lesezeit: 5 Minuten

Benutzer-Avatar
Sreeraj

Mögliches Duplikat:

Schnittstelle vs. abstrakte Klasse

Was sind die Vorteile, wenn ich die abstrakte Klasse in PHP verwende?

Was ist das Ziel, wenn ich abstrakte Klassen oder Schnittstellen verwende?

Beide erstellen einfach Definitionsnamen ohne Körper

  • mehr: stackoverflow.com/search?q=abstract+class+interface+php

    – Gordon

    16. Juni 2011 um 14:13 Uhr

  • Ja, ich verstehe … möchte die Frage schließen

    – Sreeraj

    16. Juni 2011 um 14:19 Uhr

  • Bah, nachdem ich zehn Minuten damit verbracht habe, eine Antwort zu schreiben? 🙁

    – Beere Langerak

    16. Juni 2011 um 14:22 Uhr

  • @Berry, und zwar ein sehr guter!

    – Brad

    16. Juni 2011 um 14:23 Uhr

  • @Berry, du hast gute Arbeit geleistet. Danke dafür. Es wird für immer hier sein

    – Sreeraj

    16. Juni 2011 um 14:33 Uhr

Benutzer-Avatar
Beere Langerak

Was sind die Vorteile, wenn ich die abstrakte Klasse in PHP verwende? ich kann da nichts gutes finden. Ich denke, ich kann leicht alle Arbeiten erledigen, ohne die abstrakte Klasse zu verwenden?

Sie könnten natürlich. Wenn jedoch viele Objekte vom gleichen Typ sind, kann es hilfreich sein, gemeinsame Funktionen in eine “Basis”-Klasse zu extrahieren, was bedeutet, dass Sie diese Logik nicht duplizieren müssen.

Es gibt aber eigentlich zwei Gründe. Der erste Grund wäre für mich, dass alle Nachkommen Ihrer abstrakten Klasse die haben dieselbe Art, und beide halten sich an genau dieselbe Schnittstelle. Das bedeutet, dass beispielsweise ein PDF-Dokument dieselbe Schnittstelle wie ein docx-Dokument hat und der Client-Code sich nicht darum kümmern muss, welches Objekt er behandelt. Kurzes Beispiel (in PHP).

<?php
abstract class Document {
    protected $author;

    public function __construct( $author ) {
        $this->author = $author;
    }

    abstract public function render( );

    public function author( ) {
        return $this->author;
    }
}

class PdfDocument extends Document {
    public function render( ) {
        // do something PDF specific here.
    }
}

class DocxDocument extends Document {
    public function render( ) {
        // do something DOCX specific here.
    }
}


class DocumentHandler {
    public function handle( Document $document ) {
        $this->log( 'Author has been read ' . $document->author( ) );
        return $document->render( );
    }
}

Zuerst; Beachten Sie die Tatsache, dass die DocumentHandler-Klasse keine Kenntnis davon hat, welche Art von Dokument sie tatsächlich verarbeitet. Es ist sogar egal. Es ist unwissend. Wie auch immer, es tut wissen, welche Methoden aufgerufen werden können, da die Schnittstelle zwischen den beiden Arten von Dokumenten dieselbe ist. Das nennt man Polymorphismusund könnte genauso einfach durch die Implementierung einer Dokumentenschnittstelle erreicht werden.

Der zweite Teil ist; Wenn jedes einzelne Dokument einen Autor hat und dieser Autor immer angefordert wird, könnten Sie die Methode sowohl auf das PdfDocument als auch auf das DocxDocument kopieren, aber Sie würden sich selbst duplizieren. Wenn Sie beispielsweise entscheiden, dass der Autor in Großbuchstaben geschrieben werden soll, und Sie $this->author in ucwords( $this->author ) ändern würden, müssten Sie dies so oft tun, wie Sie möchten. habe diese Methode kopiert. Mit einer abstrakten Klasse können Sie Verhalten definieren, während Sie die Klasse selbst als unvollständig markieren. Dies ist sehr praktisch.

Ich hoffe, das hilft.

  • Super Erklärung, danke!

    – Steve Baumann

    2. Juli 2014 um 16:48 Uhr

  • @Berry LangerakIch verstehe das nicht: $this->log( ‘Autor wurde gelesen ‘ . $document->author( ) ); Wie übergeben Sie den Var-Wert an den Dokumentkonstruktor?

    – Pregmatch

    2. April 2015 um 22:08 Uhr


  • @pregmatch Es ist lange her, aber ich lasse es hier für alle, die die gleiche Frage haben. Wenn er also ein neues Objekt der Klasse PdfDocument erstellt, wird er es dort als Argument übergeben, z. B.: $ author = ‘James Joyce ‘; $document = new PdfDocument($autor); (von dort wird es an den Klassenkonstruktor von Document übergeben) dann so etwas wie: $DocumentHandler = new DocumentHandler(); und $DocumentHandler->handle( $document);

    – skechav

    1. Juni 2017 um 0:05 Uhr

  • @pregmatch Ich habe ein detaillierteres Beispiel zur Verwendung in Pastebin hinzugefügt, falls Sie es testen möchten. Es ist nur Berrys erweitertes Langerak-Beispiel. https://stackoverflow.com/questions/6373224/what-are-the-advantage-if-i-use-abstract-class-in-php pastebin.com/fafiMbXL

    – skechav

    1. Juni 2017 um 0:28 Uhr

Abstrakte Klassen helfen Ihnen, wenn Sie viele Klassen haben, die dieselben Methoden haben.

Beispiel:

abstract class Foo {
  public function foo1() {
    //Do something
  }

  public abstract class foo2();
}

class Bar extends Foo {
  public class foo2() {
    //Do something
  }
}

class Baz extends Foo {
}

Was wird passieren:

  • Sie können nicht verwenden new Foo();, Foo ist abstrakt.
  • Sie werden in der Lage sein zu verwenden Bar.foo1() und Baz.foo1()sie werden dasselbe tun.
  • Sie werden einen Fehler haben, weil Baz implementiert die abstrakte Methode nicht foo2.

Beispiel, wo es nützlich ist:

abstract class Shape {
  public function display() { /* ... */ }
  //...
}

class Circle extends Shape {
  //...
}

class Rectangle extends Shape {
  //...
}

//...

Sie möchten, dass jede Klasse dazu in der Lage ist display()aber so etwas wie “Form” an sich gibt es nicht.

Nicht alle Methoden der abstrakten Klasse müssen leer sein, es kann einige grundlegende Methoden (und Eigenschaften) geben, mit denen man arbeiten kann. Zum Beispiel – Sie haben einen E-Shop und entwickeln eine abstrakte Klasse zum Importieren von Produkten. Die Klasse hat eine Methode zum Speichern von Produkten in der Datenbank, zum Generieren der URL des Produkts und eine abstrakte Methode zum Abrufen von Produkten von irgendwo (die daher in der erweiterten Klasse implementiert werden muss). Die Schnittstelle hat nur leere Methoden und keine Eigenschaften (kann jedoch Konstanten haben), daher kann es keine tatsächliche Logik geben, nur Methodenkonstanten, Methodennamen und ihre Zugriffsmodifikatoren.

Wie der Name schon sagt, besteht der Zweck einer Schnittstelle darin, die Schnittstelle explizit zu Daten und Methoden zu deklarieren, die von einer Klasse und den Instanzen bereitgestellt werden, ohne dass diese Methoden sofort codiert werden müssen. Das klassische Beispiel sind geometrische Formen. Eine solche Schnittstelle könnte eine Methode definieren, die die Fläche einer solchen Form erzeugt:

interface Shape {
    public function getArea();
}

Es könnte eine Reihe verschiedener Klassen geben, die diese Schnittstelle implementieren, wie z Circle und Square das würde verschiedene Implementierungen für das Verfahren bereitstellen getArea(). Sie könnten dann eine Funktion implementieren, die Informationen zu einer beliebigen geometrischen Form anzeigt:

function displayInformation(Shape $shape) {
    echo "The area of this shape is: " . $shape->getArea();
}

Sie könnten jedes implementierte Objekt übergeben Shape Schnittstelle zu dieser Funktion, und die Schnittstelle garantiert, dass die getArea() Methode ist vorhanden.

Natürlich könnten diese Konzepte in Programmiersprachen nützlicher sein, die stärker typisiert sind als PHP.

1137080cookie-checkWas sind die Vorteile, wenn ich die abstrakte Klasse in PHP verwende? [duplicate]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy