Heim > Artikel > Backend-Entwicklung > Was ist der Unterschied zwischen abstrakten PHP-Klassen und Schnittstellen?
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.
Abstract-Klasse
Eine offizielle Beschreibung finden Sie im Dokument. Das Folgende ist die offizielle Beschreibung. Eine gekämmte Version der Beschreibung:
(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" ; } }
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
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 :
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!