Heim  >  Artikel  >  Backend-Entwicklung  >  Der Unterschied zwischen abstrakten Klassen und Schnittstellen in PHP

Der Unterschied zwischen abstrakten Klassen und Schnittstellen in PHP

不言
不言Original
2018-04-04 14:04:251891Durchsuche

Der Unterschied zwischen abstrakten PHP-Klassen und -Schnittstellen

Tags: abstrakte Klassenschnittstelle, abstrakte Klasse und PHP-Schnittstelle


Einleitung: Dies ist eine Frage, die oft in Vorstellungsgesprächen gestellt wird und auch eine klassische Frage ist. Wir geben unser Bestes, offizielle verbindliche Anweisungen zu zitieren oder Experimente durchzuführen, um die Richtigkeit der in diesem Artikel dargelegten Inhalte zu beweisen.

Abstrakte Klasse

Bitte überprüfen Sie das Dokument für die offizielle Beschreibung. Das Folgende ist eine vereinfachte Version der offiziellen Beschreibung:

  • A 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. (Eine abstrakte Klasse verfügt möglicherweise nicht über abstrakte Methoden, kann aber dennoch nicht instanziiert werden.) Eine als abstrakt definierte Methode deklariert nur ihre aufrufende Methode (Parameter) und kann nicht ihre spezifische Funktionsimplementierung definieren. Wenn beispielsweise

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

     // 普通方法(非抽象方法)
     public function  printOut () {
        print  $this -> getValue () .  "\n" ;
    }
}
  • eine abstrakte Klasse erbt, muss die nicht abstrakte Unterklasse zusätzlich alle abstrakten Methoden in der übergeordneten Klasse definieren Die Steuerung dieser Methoden muss mit der der übergeordneten Klasse identisch sein (oder entspannter). 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. Beispielsweise definiert die Unterklasse einen optionalen Parameter ( ähnlich der Funktion eat(

    b=1) Der $b ist der optionale Parameter ), aber er ist nicht in der Deklaration der abstrakten Methode der übergeordneten Klasse enthalten, dann besteht kein Konflikt zwischen den beiden Deklarationen. Dies gilt auch für Konstruktoren seit PHP 5.4. Konstruktordeklarationen vor PHP 5.4 könnten unterschiedlich sein.

  • Ergänzung:

  1. Abstrakte Klassen können Mitgliedsattribute haben.

  2. 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. Es ist als privat definiert und kann nicht von außen zugänglich sein. Der folgende Fehler wird gemeldet

abstract class Sutdent extends Human{
    abstract private function study();}

Schwerwiegender Fehler: Die abstrakte Funktion Sutdent::study() kann in D:11index.php online nicht als privat deklariert werden 10

  1. Abstrakte Klassen können abstrakte Klassen erben und können abstrakte Methoden abstrakter übergeordneter Klassen nicht überschreiben. Eine solche Verwendung kann als Erweiterung abstrakter Klassen verstanden werden. Beispiel:

abstract class  Human{
    abstract function eat();}abstract class Sutdent extends Human{
    abstract function study();
    //abstract function eat(); 若重写抽象父类的抽象方法eat()会报错}

Wenn Sie die abstrakte Methode der abstrakten übergeordneten Klasse überschreiben, wird der folgende Fehler gemeldet:

Schwerwiegender Fehler: Can' t erbt die abstrakte Funktion Human::eat() (zuvor in Sutdent deklariert) in D:11index.php in Zeile 11

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();  }

### Implementierung der zu implementierenden Schnittstelle

Eine Schnittstelle, die den Implements-Operator verwendet. 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:
Sie können abstrakte Klassen erben und gleichzeitig Schnittstellen implementieren. Abstrakte Klassen implementieren Schnittstellen und es besteht keine Notwendigkeit, die darin enthaltenen Methoden neu zu schreiben.

  • 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 die gleichen sind wie die in der Schnittstelle definierten. 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();}

Vererbung von Schnittstellen

Eine Schnittstelle kann eine andere oder mehrere Schnittstellen erben, das Schlüsselwort „extens“ verwenden und mehrere durch „,“ trennen. kann aber keine andere Schnittstelle implementieren und natürlich 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 Play1  {   
    public function PlayFootball();  }interface PlayGame extends play,Play1{  
    public function PlayLOL();  }

Zusammenfassung

Normalerweise werden die Gemeinsamkeiten und Unterschiede hier geschrieben, aber ich schreibe sie nicht, hehe, weil ich denke, dass das oben Genannte detailliert genug ist .

Fassen wir kurz zusammen: Abstrakte Klassen werden im Allgemeinen verwendet, um einen Entitätstyp zu definieren. Was ist das? Es umfasst Attribute, abstrakte Methoden und nicht abstrakte Methoden. Die Schnittstelle wird verwendet, um zu definieren, was ein Entitätstyp tun kann . Es wird allgemein angenommen, dass es nur abstrakte Methoden gibt und Konstanten selten verwendet werden.

Verwandte Empfehlungen:

Der Unterschied zwischen abstrakten PHP-Klassen und -Schnittstellen

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

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn