Was ist eine abstrakte Klasse in PHP?

121

Was ist eine abstrakte Klasse in PHP?

Wie kann es verwendet werden?

udaya
quelle
6
@ Gordon: Manchmal sind offizielle Dokumente für manche Leute nicht so klar :(
Sarfraz
3
@Sarfraz, das ist nicht auf RTFM-Weise gemeint. Ich denke nur, dass ein Link zur offiziellen Dokumentation ein hilfreiches Gut ist. Und Sie würden nicht glauben, wie viele Leute keine offiziellen Dokumente lesen oder gar wissen, dass sie existieren.
Gordon

Antworten:

131

Eine abstrakte Klasse ist eine Klasse, die mindestens eine abstrakte Methode enthält, eine Methode ohne tatsächlichen Code, nur den Namen und die Parameter, und die als "abstrakt" markiert wurde.

Der Zweck dieses Vorgangs besteht darin, eine Art Vorlage bereitzustellen, von der geerbt werden kann, und die erbende Klasse zu zwingen, die abstrakten Methoden zu implementieren.

Eine abstrakte Klasse ist also etwas zwischen einer regulären Klasse und einer reinen Schnittstelle. Schnittstellen sind auch ein Sonderfall von abstrakten Klassen, bei denen ALLE Methoden abstrakt sind.

Weitere Informationen finden Sie in diesem Abschnitt des PHP-Handbuchs.

selfawaresoup
quelle
6
In diesem Thread enthält das Abstract keine abstrakte Methode.
r0ng
6
@ r0ng Es wäre richtiger zu sagen, dass eine abstrakte Klasse kann abstrakte Methoden enthält, und abstrakte Methoden müssen immer in einer abstrakten Klasse sein. Die bestimmenden praktischen Merkmale in meinem Kopf sind, dass eine abstrakte Klasse nicht instanziiert werden kann, aber Sie Methoden erben und überschreiben können und statische Methoden von einer abstrakten Klasse normal verwendet werden können.
Okdewit
117

Abstrakte Klassen sind Klassen, die eine oder mehrere abstrakte Methoden enthalten. Eine abstrakte Methode ist eine Methode, die deklariert ist, aber keine Implementierung enthält. Abstrakte Klassen können möglicherweise nicht instanziiert werden und erfordern Unterklassen, um Implementierungen für die abstrakten Methoden bereitzustellen.

1. Abstrakte Klasse kann nicht instanziiert werden : Klassen, die als abstrakt definiert sind, dürfen nicht instanziiert werden, und jede Klasse, die mindestens eine abstrakte Methode enthält, muss ebenfalls abstrakt sein.

Beispiel unten:

abstract class AbstractClass
{

    abstract protected function getValue();
    abstract protected function prefixValue($prefix);


    public function printOut() {
        echo "Hello how are you?";
    }
}

$obj=new AbstractClass();
$obj->printOut();
//Fatal error: Cannot instantiate abstract class AbstractClass

2. Jede Klasse, die mindestens eine abstrakte Methode enthält, muss ebenfalls abstrakt sein : Die abstrakte Klasse kann abstrakte und nicht abstrakte Methoden enthalten, muss jedoch mindestens eine abstrakte Methode enthalten. Wenn eine Klasse mindestens eine abstrakte Methode hat, muss die Klasse als abstrakt deklariert werden.

Hinweis: Merkmale unterstützen die Verwendung abstrakter Methoden, um Anforderungen an die ausstellende Klasse zu stellen.

Beispiel unten:

class Non_Abstract_Class
{
   abstract protected function getValue();

    public function printOut() {
        echo "Hello how are you?";
    }
}

$obj=new Non_Abstract_Class();
$obj->printOut();
//Fatal error: Class Non_Abstract_Class contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (Non_Abstract_Class::getValue)

3. Eine abstrakte Methode darf keinen Body enthalten : Als abstrakt definierte Methoden deklarieren einfach die Signatur der Methode - sie können die Implementierung nicht definieren. Eine nicht abstrakte Methode kann jedoch die Implementierung definieren.

abstract class AbstractClass
{
   abstract protected function getValue(){
   return "Hello how are you?";
   }

    public function printOut() {
        echo $this->getValue() . "\n";
    }
}

class ConcreteClass1 extends AbstractClass
{
    protected function getValue() {
        return "ConcreteClass1";
    }

    public function prefixValue($prefix) {
        return "{$prefix}ConcreteClass1";
    }
}

$class1 = new ConcreteClass1;
$class1->printOut();
echo $class1->prefixValue('FOO_') ."\n";
//Fatal error: Abstract function AbstractClass::getValue() cannot contain body

4. Beim Erben von einer abstrakten Klasse müssen alle in der Klassendeklaration des übergeordneten Elements als abstrakt gekennzeichneten Methoden vom Kind definiert werden : Wenn Sie eine abstrakte Klasse erben, müssen Sie Implementierungen für alle darin enthaltenen abstrakten Methoden bereitstellen.

abstract class AbstractClass
{
    // Force Extending class to define this method
    abstract protected function getValue();

    // Common method
    public function printOut() {
        print $this->getValue() . "<br/>";
    }
}

class ConcreteClass1 extends AbstractClass
{
    public function printOut() {
        echo "dhairya";
    }

}
$class1 = new ConcreteClass1;
$class1->printOut();
//Fatal error: Class ConcreteClass1 contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (AbstractClass::getValue)

5. Gleiche (oder weniger eingeschränkte) Sichtbarkeit : Beim Erben von einer abstrakten Klasse müssen alle in der Klassendeklaration des Elternteils als abstrakt gekennzeichneten Methoden vom Kind definiert werden. Darüber hinaus müssen diese Methoden mit derselben (oder einer weniger eingeschränkten) Sichtbarkeit definiert werden. Wenn die abstrakte Methode beispielsweise als geschützt definiert ist, muss die Funktionsimplementierung entweder als geschützt oder öffentlich, jedoch nicht als privat definiert werden.

Beachten Sie, dass die abstrakte Methode nicht privat sein sollte.

abstract class AbstractClass
{

    abstract public function getValue();
    abstract protected function prefixValue($prefix);

        public function printOut() {
        print $this->getValue();
    }
}

class ConcreteClass1 extends AbstractClass
{
    protected function getValue() {
        return "ConcreteClass1";
    }

    public function prefixValue($prefix) {
        return "{$prefix}ConcreteClass1";
    }
}
$class1 = new ConcreteClass1;
$class1->printOut();
echo $class1->prefixValue('FOO_') ."<br/>";
//Fatal error: Access level to ConcreteClass1::getValue() must be public (as in class AbstractClass)

6. Die Signaturen der abstrakten Methoden müssen übereinstimmen : Beim Erben von einer abstrakten Klasse müssen alle in der Klassendeklaration des Elternteils als abstrakt gekennzeichneten Methoden vom Kind definiert werden. Die Signaturen der Methoden müssen übereinstimmen, dh die Typhinweise und die Anzahl der erforderlichen Argumente müssen gleich sein. Wenn die untergeordnete Klasse beispielsweise ein optionales Argument definiert, bei dem die Signatur der abstrakten Methode dies nicht tut, liegt kein Konflikt in der Signatur vor.

abstract class AbstractClass
{

    abstract protected function prefixName($name);

}

class ConcreteClass extends AbstractClass
{


    public function prefixName($name, $separator = ".") {
        if ($name == "Pacman") {
            $prefix = "Mr";
        } elseif ($name == "Pacwoman") {
            $prefix = "Mrs";
        } else {
            $prefix = "";
        }
        return "{$prefix}{$separator} {$name}";
    }
}

$class = new ConcreteClass;
echo $class->prefixName("Pacman"), "<br/>";
echo $class->prefixName("Pacwoman"), "<br/>";
//output: Mr. Pacman
//        Mrs. Pacwoman

7. Abstrakte Klasse unterstützt keine Mehrfachvererbung : Abstrakte Klasse kann eine andere abstrakte Klasse erweitern, Abstrakte Klasse kann die Implementierung der Schnittstelle bereitstellen. Sie unterstützt jedoch keine Mehrfachvererbung.

interface MyInterface{
    public function foo();
    public function bar();
}

abstract class MyAbstract1{
    abstract public function baz();
}


abstract class MyAbstract2 extends MyAbstract1 implements MyInterface{
    public function foo(){ echo "foo"; }
    public function bar(){ echo "bar"; }
    public function baz(){ echo "baz"; }
}

class MyClass extends MyAbstract2{
}

$obj=new MyClass;
$obj->foo();
$obj->bar();
$obj->baz();
//output: foobarbaz

Hinweis: Bitte beachten Sie, dass die Reihenfolge oder Positionierung der Klassen in Ihrem Code den Interpreter beeinflussen und einen schwerwiegenden Fehler verursachen kann. Achten Sie daher bei Verwendung mehrerer Abstraktionsebenen auf die Positionierung der Klassen im Quellcode.

Das folgende Beispiel führt zu einem schwerwiegenden Fehler: Klasse 'Pferd' wurde nicht gefunden

class cart extends horse {
    public function get_breed() { return "Wood"; }
}

abstract class horse extends animal {
    public function get_breed() { return "Jersey"; }
}

abstract class animal {
    public abstract function get_breed();
}

$cart = new cart();
print($cart->get_breed());
Dhairya Lakhera
quelle
1
Gut ausgearbeitet.
Talk2Nit
18

Eine abstrakte Klasse ist eine Klasse, die vom Programmierer nur teilweise implementiert wird. Es kann eine oder mehrere abstrakte Methoden enthalten. Eine abstrakte Methode ist einfach eine Funktionsdefinition, die dem Programmierer mitteilt, dass die Methode in einer untergeordneten Klasse implementiert werden muss.

Es gibt gute Erklärung, dass hier .

Sarfraz
quelle
Hallo, danke für die Erklärung, die Wahrheit ist, dass es im Internet keine so gute Erklärung für Abstract und Interface in PHP gibt.
Lenin Zapata
12

Abstrakte Klasse
1. Enthält eine abstrakte Methode
2. Kann nicht direkt initialisiert werden
3. Kann kein Objekt der abstrakten Klasse erstellen
4. Wird nur für Vererbungszwecke verwendet

Abstrakte Methode
1. Kann keinen Body enthalten
2. Kann nicht als privat definiert werden
3. Untergeordnete Klassen müssen die in der abstrakten Klasse deklarierten Methoden definieren

Beispielcode:

abstract class A {
    public function test1() {
        echo 'Hello World';
    }
    abstract protected function f1();
    abstract public function f2();
    protected function test2(){
        echo 'Hello World test';
    }
}

class B extends A {
    public $a = 'India';
    public function f1() {
        echo "F1 Method Call";
    }
    public function f2() {
        echo "F2 Method Call";
    }
}

$b = new B();
echo $b->test1() . "<br/>";
echo $b->a . "<br/>";
echo $b->test2() . "<br/>";
echo $b->f1() . "<br/>";
echo $b->f2() . "<br/>";

Ausgabe:

Hello World
India
Hello World test
F1 Method Call
F2 Method Call
vivek s vamja
quelle
Sie können die übergeordnete geschützte Methode nicht über das untergeordnete Klassenobjekt aufrufen. Sie können die untergeordnete Klassenmethode über dieses Objekt aufrufen. echo $ b-> test2 (). "<br/>";
Al-Amin
7
  • Abstract Class enthält nur die Signatur der Methode deklarieren, sie können die Implementierung nicht definieren.
  • Abstraktionsklassen werden mit dem Schlüsselwort abstract definiert .
  • Abstract Class kann keine Mehrfachvererbung implementieren .
  • Die neueste Version von PHP 5 enthält abstrakte Klassen und Methoden.
  • Als abstrakt definierte Klassen können das Objekt nicht erstellen (möglicherweise nicht instanziiert).
Elangovan
quelle
0

Abstrakte Klassen sind solche Klassen, die nicht direkt initialisiert werden können. Mit anderen Worten können wir sagen, dass abstrakte Klassen solche Klassen sind, deren Objekt nicht direkt erstellt werden kann. In PHP werden abstrakte Klassen mit dem Schlüsselwort abstract herausgefordert .

Um eine Klasse abstrakt zu werden, muss mindestens eine Methode der Klasse abstrakt sein.

Einzelheiten zur abstrakten Klasse finden Sie in meinem Blog zur abstrakten Klasse in PHP .

Ankur Kumar Singh
quelle
0

Eine abstrakte Klasse ist wie die normale Klasse, die Variablen enthält. Sie enthält geschützte Variablen. Funktionen. Sie enthält den Konstruktor. Nur eines ist anders. Sie enthält eine abstrakte Methode.

Die abstrakte Methode bedeutet eine leere Methode ohne Definition, so dass nur ein Unterschied in der abstrakten Klasse kein Objekt der abstrakten Klasse erstellen kann

Abstract muss die abstrakte Methode enthalten und diese Methoden müssen in ihrer ererbenden Klasse definiert sein.

Shriyash Deshmukh
quelle