2010-04-01 7 views
72

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

+1

* (Referenz) * http://de2.php.net/manual/en/language.oop5.abstract.php – Gordon

+2

* (bezogen) * http: // Stackoverflow.com/questions/2288467/Was-ist-der-Zweck-der-abstrakten-Klasse – Gordon

+4

@Gordon: Manchmal offizielle Dokumente sind nicht so klar für einige Leute :( – Sarfraz

Antwort

87

Eine abstrakte Klasse ist eine Klasse, die mindestens eine abstrakte Methode enthält, bei der es sich nicht um einen tatsächlichen Code handelt, sondern nur um den Namen und die Parameter, der als "abstrakt" gekennzeichnet wurde.

Der Zweck davon ist, eine Art Vorlage zur Verfügung zu stellen, um die erbende Klasse zu übernehmen und zu erzwingen, um die abstrakten Methoden zu implementieren.

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

Weitere Informationen finden Sie in this section des PHP-Handbuchs.

+3

In [this thread] (http://stackoverflow.com/questions/254514/php-and-enumerations) enthält das Abstract keine abstrakte Methode. – r0ng

+1

@ r0ng Es wäre korrekter zu sagen, dass eine abstrakte Klasse * abstrakte Methoden enthalten kann und abstrakte Methoden immer innerhalb einer abstrakten Klasse sein müssen. Die definierenden praktischen Funktionen in meinem Kopf sind, dass eine abstrakte Klasse nicht instanziiert werden kann, aber Sie können Methoden erben und überschreiben, und statische Methoden aus einer abstrakten Klasse können normal verwendet werden. – Fx32

13

An abstract class is a class that is only partially implemented by the programmer. It may contain one or more abstract methods. An abstract method is simply a function definition that serves to tell the programmer that the method must be implemented in a child class.

Es gibt gute Erklärung dieser here.

+0

@Sarfraz Ich mag deinen magischen Dialer übrigens. Irgendeine Chance, die in Deutschland funktionieren wird? –

+0

@Pekka Ich bin ziemlich sicher, dass Sie Ihre SIM-Karte nach n falschen Versuchen autolocked haben. – Gordon

+0

@Gordon Mist. Ich hoffte, um meine 2-jährigen Vertragsfesseln endlich loszuwerden :) Ich mag, wie dieser Artikel w da am * 27. März * :) –

5

-Link: Abstract Class in Php and oops

  • Abstrakte Klasse enthält nur die Unterschrift des Verfahrens erklären, können sie nicht die Umsetzung definieren.
  • Abstraktionsklasse werden mit dem Schlüsselwort abstract definiert.
  • Abstract Klasse ist nicht möglich zu implementieren Mehrfachvererbung.
  • Neueste Version von PHP 5 hat abstrakte Klassen und Methoden eingeführt.
  • Klassen als abstrakt definiert, sind wir nicht in der Lage, das Objekt (nicht instanziiert)

http://www.codingslover.com/2015/07/abstract-class-in-php.html

56

Abstract classes are classes that contain one or more abstract methods. An abstract method is a method that is declared, but contains no implementation. Abstract classes may not be instantiated, and require subclasses to provide implementations for the abstract methods.

1. instanziiert Kann nicht abstrakte Klasse zu erstellen: können Klassen als abstrakt definiert 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 auch mindestens eine abstrakte Methode enthält abstrakt sein muss: Abstrakte Klasse kann abstrakte haben und nicht-abstrakte Methoden, aber es muss mindestens ein enthält abstrakte Methode. Wenn eine Klasse mindestens eine abstrakte Methode hat, muss die Klasse als abstrakt deklariert werden.

Note: Traits support the use of abstract methods in order to impose requirements upon the exhibiting class.

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 kann nicht Körper enthalten: Methoden als abstrakt definiert einfach die Unterschrift des Verfahrens erklären - sie die Umsetzung nicht definieren können. Aber eine nicht-abstrakte Methode kann 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. Wenn von einer abstrakten Klasse erbt alle Methoden in der Klassendeklaration abstrakt markiert der Eltern muss durch das Kind definiert werden: Wenn Sie eine abstrakte Klasse erben Sie Implementierungen für alle abstrakten Methoden zu bieten haben drin.

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. Same (oder weniger eingeschränkt) Sichtbarkeit: Wenn von einer abstrakten Klasse erbt alle Methoden abstrakt markiert in der Klassendeklaration der Eltern müssen das Kind festgelegt werden; Außerdem müssen diese Methoden mit derselben (oder 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, aber nicht als privat definiert sein.

Note that abstract method should not be private.

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. Unterschriften der abstrakten Methoden müssen entsprechen: Wenn von einer abstrakten Klasse erbt alle Methoden abstrakt markiert in der Klassendeklaration der Eltern müssen vom Kind definiert werden, die Signaturen der Methoden müssen übereinstimmen, dh die Typhinweise und die Anzahl der benötigten Argumente müssen übereinstimmen. Wenn die untergeordnete Klasse beispielsweise ein optionales Argument definiert, für das die Signatur der abstrakten Methode nicht gilt, besteht kein 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 sich eine andere abstrakte Klasse, Abstrakte Klasse, die Umsetzung von interface.But bieten kann es keine Mehrfachvererbung nicht unterstützt.

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 

Note: Please note order or positioning of the classes in your code can affect the interpreter and can cause a Fatal error. So, when using multiple levels of abstraction, be careful of the positioning of the classes within the source code.

Beispiel unten wird Fatal Fehler verursachen: 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()); 
6

Abstrakte Klasse
1. Enthält eine abstrakte Methode
2. Kann nicht sein direkt initialisiert
3. Kann ein Objekt der abstrakten Klassenicht erstellen 4. Nur für die Vererbung Zwecke
verwendet

Zusammenfassung Methode 1. kein Körper
2. nicht Kann als Privat
3. Kinderklassen definiert werden, müssen die Methoden definieren deklariert in der abstrakten Klasse enthalten

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/>"; 
Output

:

Hello World 
India 
Hello World test 
F1 Method Call 
F2 Method Call 
+0

Sie können die übergeordnete geschützte Methode nicht vom untergeordneten Klassenobjekt aufrufen, Sie können die untergeordnete Klassenmethode von diesem Objekt aufrufen echo $ b-> test2(). "
"; –