Heim >Backend-Entwicklung >PHP-Tutorial >Was ist der Unterschied zwischen abstrakten PHP-Klassen und Schnittstellen?

Was ist der Unterschied zwischen abstrakten PHP-Klassen und Schnittstellen?

青灯夜游
青灯夜游nach vorne
2020-07-16 16:36:552638Durchsuche

Dieser Artikel stellt Ihnen den Unterschied zwischen abstrakten PHP-Klassen und -Schnittstellen vor. Es hat einen gewissen Referenzwert. Freunde in Not können sich darauf beziehen. Ich hoffe, es wird für alle hilfreich sein.

Was ist der Unterschied zwischen abstrakten PHP-Klassen und Schnittstellen?

Abstract-Klasse

Eine offizielle Beschreibung finden Sie im Dokument. Das Folgende ist die offizielle Beschreibung. Eine gekämmte Version der Beschreibung:

  • Eine als abstrakt definierte Klasse kann nicht instanziiert werden. Jede Klasse muss als abstrakt deklariert werden, wenn mindestens eine Methode darin als abstrakt deklariert ist.

(Abstrakte Klassen können keine abstrakten Methoden haben, aber abstrakte Klassen können trotzdem nicht instanziiert werden) Eine als abstrakt definierte Methode deklariert nur ihre aufrufende Methode (Parameter), kann nicht definiert werden spezifische Funktion realisiert wird.

Zum Beispiel:

abstract class  AbstractClass
 {
     // 强制要求子类定义这些方法,且不能定义具体功能 注意没有大括号{}
     abstract protected function  getValue ();
     abstract protected function  prefixValue ( $prefix );

     // 普通方法(非抽象方法)
     public function  printOut () {
        print  $this -> getValue () .  "\n" ;
    }
}
  • Beim Erben einer abstrakten Klasse muss die nicht abstrakte Unterklasse alle abstrakten Methoden in der übergeordneten Klasse definieren mit der übergeordneten Klasse gleich (oder lockerer) konsistent sein. Wenn beispielsweise eine abstrakte Methode als geschützt deklariert ist, sollte die in der Unterklasse implementierte Methode als geschützt oder öffentlich deklariert werden und kann nicht als privat definiert werden.
  • Außerdem müssen die Methodenaufrufmethoden übereinstimmen, d. h. Art und Anzahl der erforderlichen Parameter müssen konsistent sein. Wenn die Unterklasse beispielsweise einen optionalen Parameter definiert ( ähnelt der Funktion eat($a,$b=1), $b ist der optionale Parameter), dieser jedoch nicht in der Deklaration enthalten ist abstrakte Methode der übergeordneten Klasse, dann Es gibt keinen Konflikt zwischen den beiden Anweisungen. Dies gilt auch für Konstruktoren seit PHP 5.4. Konstruktordeklarationen vor PHP 5.4 könnten unterschiedlich sein.

Ergänzung:

1.

Jemand hat gefragt: Können abstrakte Methoden als privat definiert werden? Die Antwort lautet „Nein“, da der Zweck abstrakter Schnittstellen darin besteht, das Klassenmodell für die Vererbung zu abstrahieren Wenn der Designzweck nicht erfüllt wird, wird ein Fehler gemeldet.

3. Abstrakte Klassen können Schnittstellen implementieren und müssen die darin enthaltenen Methoden nicht implementieren

abstract class Sutdent extends Human
{
    abstract private function study();
}
Fatal error: Abstract function Sutdent::study() cannot be declared private in ...

4. Abstrakte Klassen können abstrakte Klassen erben und können abstrakte Klassen nicht überschreiben Abstrakte Methode der übergeordneten Klasse. Eine solche Verwendung kann als Erweiterung abstrakter Klassen verstanden werden. Wie zum Beispiel

abstract class  Human
{
    abstract function eat();
}

abstract class Sutdent extends Human
{
    abstract function study();
    //abstract function eat(); 若重写抽象父类的抽象方法eat()会报错 Fatal error: Can't inherit abstract function Human::eat() (previously declared abstract in Sutdent) in ...
}

Schnittstelle

1. Definition der Schnittstelle

  • Mithilfe einer Schnittstelle können Sie angeben, welche Methoden eine Klasse implementieren muss, Sie müssen jedoch nicht den spezifischen Inhalt dieser Methoden definieren.
  • Eine Schnittstelle wird über das Schlüsselwort interface definiert, genau wie die Definition einer Standardklasse, aber alle darin definierten Methoden sind leer.
  • Alle in der Schnittstelle definierten Methoden müssen öffentlich sein. Dies ist eine Eigenschaft der Schnittstelle. Geschützt und privat wird ein Fehler gemeldet (Schwerwiegender Fehler: Zugriffstyp für Schnittstellenmethode).
  • Konstante: Konstanten können auch in Schnittstellen definiert werden. Schnittstellenkonstanten werden genauso verwendet wie Klassenkonstanten, können jedoch nicht von Unterklassen oder Unterschnittstellen überschrieben werden. (Es wird nicht empfohlen, diese Methode zu verwenden. Mir fällt wirklich keine Bedeutung ein und es kann leicht zu Verwirrung mit abstrakten Klassen kommen.)
interface Play  
{  
    const LEVEL=10;  
    public function PlayLOL();  
    public function PlayFootball();  
}

2 der Schnittstelle

Um eine Schnittstelle zu implementieren, verwenden Sie den Operator implements. Nicht abstrakte Klassen müssen alle in der Schnittstelle definierten Methoden implementieren, andernfalls wird ein schwerwiegender Fehler gemeldet. Eine Klasse kann mehrere Schnittstellen implementieren. Verwenden Sie Kommas, um die Namen mehrerer Schnittstellen zu trennen.

Ergänzung :

  • kann abstrakte Klassen erben und gleichzeitig Schnittstellen implementieren, und Erweiterungen sollten vorangestellt werden.
  • Abstrakte Klassen implementieren Schnittstellen und es besteht keine Notwendigkeit, die darin enthaltenen Methoden neu zu erstellen.
  • Bei der Implementierung mehrerer Schnittstellen dürfen Methoden in den Schnittstellen nicht denselben Namen haben.
  • Schnittstellen können auch vererbt werden, indem der Extens-Operator verwendet wird.
  • Um eine Schnittstelle zu implementieren, muss eine Klasse Methoden verwenden, die genau den in der Schnittstelle definierten entsprechen. Andernfalls kommt es zu einem schwerwiegenden Fehler.
interface Play  
{  
    const LEVEL=10;  
    public function PlayLOL();  
    public function PlayFootball();  
} 

interface Read  
{  
    public function ReadNovel();  
} 
    
abstract class  Human
{
    abstract function eat();
}
//抽象类可以实现接口后不实现其方法,可以继承一个抽象类的同时实现多个接口注意必须要把extends语句写在implements前面,否则会报错
abstract class Sutdent extends Human implements Play,Read
{
    abstract function study();
}

3. Vererbung von Schnittstellen

Eine Schnittstelle kann eine andere oder mehrere Schnittstellen erben, indem das Schlüsselwort „Extens“ verwendet wird, das durch mehrere getrennt wird ',', aber Sie können keine andere Schnittstelle implementieren, und natürlich können Sie keine abstrakte Klasse erben (Fehler beim Erben einer abstrakten Klasse: Schwerwiegender Fehler: PlayGame kann Human nicht implementieren – es ist keine Schnittstelle in D: 11index.php in Zeile 10)

interface Play  
{   
    public function PlayFootball();  
}
interface PlayNew  
{   
    public function PlayFootballNew();  
}

interface PlayGame extends play,PlayNew
{  
    public function PlayLOL();  
}

Unterschied:

1. Verwenden Sie Implementierungen für die Schnittstellenvererbung und verwenden Sie abstrakte Klassen erweitern.

2. Variablen können nicht in Schnittstellen deklariert werden, aber Klassenkonstanten können in abstrakten Klassen deklariert werden

3. Schnittstellen haben keine Konstruktoren, sondern abstrakte Klassen kann haben

4. Methoden in Schnittstellen sind standardmäßig öffentlich, und Methoden in abstrakten Klassen können mit öffentlichen, geschützten und privaten

geändert werden 5. Eine Klasse kann mehrere Schnittstellen erben, kann aber nur eine abstrakte Klasse erben

Verwandte Empfehlungen: PHP-Tutorial

Das obige ist der detaillierte Inhalt vonWas ist der Unterschied zwischen abstrakten PHP-Klassen und Schnittstellen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:cnblogs.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen