web-dev-qa-db-de.com

was ist abstrakte Klasse in PHP?

Was ist eine abstrakte Klasse in PHP? Wo kann es verwendet werden?

86
udaya

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

Der Zweck hiervon besteht darin, eine Art Vorlage bereitzustellen, aus der die erbende Klasse erben kann und die abstrakten Methoden implementieren muss.

Eine abstrakte Klasse ist also etwas zwischen einer regulären Klasse und einer reinen Schnittstelle. Schnittstellen sind auch ein Spezialfall für abstrakte Klassen, bei denen ALLE Methoden abstrakt sind.

Weitere Informationen finden Sie in diesem Abschnitt des Handbuchs PHP.

106
selfawaresoup

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 werden möglicherweise nicht instanziiert und erfordern Unterklassen, um Implementierungen für die abstrakten Methoden bereitzustellen.

1. Abstrakte Klasse kann nicht instanziiert werden : Als abstrakt definierte Klassen können nicht instanziiert werden, und jede Klasse, die mindestens eine abstrakte Methode enthält, muss auch 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 auch abstrakt sein. : 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: Traits 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 : Methoden, die als abstrakt definiert sind, geben einfach die Signatur der Methode an - 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 Objekts als abstrakt gekennzeichneten Methoden durch das untergeordnete Element definiert werden. : Wenn Sie eine abstrakte Klasse erben, müssen Sie allen abstrakten Methoden in ihr Implementierungen 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 Methoden, die in der Klassendeklaration des übergeordneten Objekts als abstrakt markiert sind, vom Kind definiert werden. Darüber hinaus müssen diese Methoden mit derselben (oder einer weniger eingeschränkten) Sichtbarkeit definiert werden. Wenn beispielsweise die abstrakte Methode als protected definiert ist, muss die Funktionsimplementierung entweder als geschützt oder als öffentlich, jedoch nicht als privat definiert werden.

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

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. Signatur der abstrakten Methoden muss übereinstimmen : Beim Erben von einer abstrakten Klasse müssen alle in der Klassendeklaration der übergeordneten Klassen als abstrakt gekennzeichneten Methoden vom Kind definiert werden, die Signaturen der Methoden müssen übereinstimmen, dh die Typhinweise und Die Anzahl der erforderlichen Argumente muss gleich sein. Wenn beispielsweise die untergeordnete Klasse ein optionales Argument definiert, die Signatur der abstrakten Methode nicht, gibt es keinen Konflikt in der Signatur.

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 weitere abstrakte Klasse erweitern. Abstrakte Klasse kann die Implementierung von interface bereitstellen. Aber sie unterstützt 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 kann und einen schwerwiegenden Fehler verursachen kann. Wenn Sie also mehrere Abstraktionsebenen verwenden, achten Sie auf die Positionierung der Klassen im Quellcode.

beispiel führt zu Schwerwiegender Fehler: Klasse 'Pferd' 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());
89
Dhairya Lakhera

Eine abstrakte Klasse ist eine Klasse nur teilweise implementiert durch die Programmierer. Es kann ein oder mehrere .__ enthalten. abstrakte Methoden. Eine abstrakte Methode ist einfach eine Funktionsdefinition, die dient dazu, dem Programmierer mitzuteilen, dass die Methode muss in einem Kind implementiert werden Klasse.

Es gibt eine gute Erklärung dafür hier.

15
Sarfraz

Abstrakte Klasse  
1. Enthält eine abstrakte Methode
2. Kann nicht direkt initialisiert werden
3. Ein Objekt der abstrakten Klasse kann nicht erstellt werden
4. Nur für Vererbungszwecke verwendet

Abstrakte Methode
1. Kann keinen Körper 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
10
vivek s vamja
  • Abstract Class enthält nur die Signatur der Methode, sie kann die Implementierung nicht definieren.
  • Abstraktionsklasse wird mit dem Schlüsselwort abstract definiert.
  • Abstract Class ist nicht möglich, Mehrfachvererbung zu implementieren.
  • Die neueste Version von PHP 5 enthält abstrakte Klassen und Methoden.
  • Klassen, die als abstrakt definiert wurden, können das Objekt nicht erstellen (möglicherweise nicht instanziiert)
6
Elangovan

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

Die abstrakte Methode bedeutet eine leere Methode ohne Definition, sodass nur ein Unterschied in der abstrakten Klasse ein Objekt der abstrakten Klasse nicht erzeugen kann

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

0

Abstrakte Klassen sind solche Klassen, die nicht direkt initialisiert werden können. Oder in 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 abgelehnt.

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

Für Details der abstrakten Klasse können Sie sich auf meinen Blog unter Abstract Class in PHP beziehen.

0