Heim >Backend-Entwicklung >PHP-Problem >Was bedeutet Polymorphismus in PHP?
In PHP bedeutet Polymorphismus, dass dieselbe Operation unterschiedliche Ausführungsergebnisse liefert, wenn sie auf Instanzen verschiedener Klassen angewendet wird. Das heißt, wenn Objekte unterschiedlichen Typs dieselbe Nachricht erhalten, erhalten sie unterschiedliche Ergebnisse. Wenn verschiedene Objekte dieselbe Nachricht erhalten, erhalten sie unterschiedliche Ergebnisse. Durch Polymorphismus kann jedes Objekt auf eine für ihn geeignete Weise auf gemeinsame Nachrichten reagieren. Polymorphismus erhöht die Flexibilität und Wiederverwendbarkeit von Software.
Die Betriebsumgebung dieses Tutorials: Windows 7-System, PHP 8-Version, DELL G3-Computer
Polymorphismus bedeutet, dass die gleiche Operation oder Funktion oder derselbe Prozess auf mehrere Objekttypen wirken kann und unterschiedliche Ergebnisse erzielen. Verschiedene Objekte können beim Empfang derselben Nachricht unterschiedliche Ergebnisse liefern. Dieses Phänomen wird als Polymorphismus bezeichnet.
Polymorphismus ermöglicht es jedem Objekt, auf allgemeine Nachrichten auf eine Weise zu reagieren, die zu ihm passt. Polymorphismus erhöht die Flexibilität und Wiederverwendbarkeit der Software.
In der objektorientierten Softwareentwicklung ist Polymorphismus einer der wichtigsten Teile. Bei der objektorientierten Programmierung geht es nicht nur darum, verwandte Methoden und Daten einfach zu kombinieren, sondern verschiedene Elemente der objektorientierten Programmierung zu verwenden, um verschiedene Situationen im wirklichen Leben klar zu beschreiben. In diesem Abschnitt wird der Polymorphismus in der objektorientierten Programmierung ausführlich erläutert.
1. Was ist Polymorphismus? Es kann als mehrere Ausdrucksformen verstanden werden, nämlich „eine externe Schnittstelle und mehrere interne Implementierungsmethoden“. In der objektorientierten Theorie lautet die allgemeine Definition von Polymorphismus: Dieselbe Operation führt zu unterschiedlichen Ausführungsergebnissen, wenn sie auf Instanzen verschiedener Klassen angewendet wird. Das heißt, wenn Objekte unterschiedlichen Typs dieselbe Nachricht erhalten, erhalten sie unterschiedliche Ergebnisse.
In der tatsächlichen Anwendungsentwicklung besteht der Hauptgrund für die Verwendung von objektorientiertem Polymorphismus darin, dass verschiedene Unterklassenobjekte als eine übergeordnete Klasse behandelt werden können und die Unterschiede zwischen verschiedenen Unterklassenobjekten abgeschirmt werden können. Schreiben Sie universellen Code und universelle Programmierung, um sie an Änderungen anzupassen Bedürfnisse.2. Polymorphes Anwendungsdesign
Um das Projekt in Zukunft problemlos erweitern und aktualisieren zu können, ist es in der Regel erforderlich, wiederverwendbare Module für eine einfache Aktualisierung durch Vererbung zu implementieren. Beim Entwerfen wiederverwendbarer Module ist es notwendig, die Verwendung von Flusskontrollanweisungen so weit wie möglich zu reduzieren. An diesem Punkt können Sie Polymorphismus verwenden, um diese Art von Design zu implementieren.
【Beispiel】 veranschaulicht die Flusskontrollanweisungen, die normalerweise zur Implementierung verschiedener Verarbeitungsarten verwendet werden. Der Code wird unten angezeigt.class painter{ //定义油漆工类 public function paintbrush(){ //定义油漆工动作 echo "油漆工正在刷漆!\n"; } } class typist{ //定义打字员类 public function typed(){ //定义打字员工作 echo "打字员正在打字!\n"; } } function printworking($obj){ //定义处理类 if(objinstanceofpainter)//若对象是油漆工类,则显示油漆工动作$obj−>paintbrush();elseif(obj instanceof typist){ //若对象是打字员类,则显示打字员动作 $obj->typed(); }else{ //若非以上类,则显示出错信息 echo "Error: 对象错误!"; } } printworking(new painter()); //显示员工工作 printworking(new typist()); //显示员工工作Analyse: Definieren Sie im obigen Programm zunächst zwei Mitarbeiterklassen: Malerklasse und Schreibkraftklasse. Definieren Sie dann eine Verarbeitungsfunktion. In dieser Funktion wird beurteilt, ob es sich bei dem Mitarbeiter um einen definierten Mitarbeiter handelt, und der Arbeitsstatus des Mitarbeiters wird ausgedruckt. Die Ergebnisse sind unten aufgeführt.
油漆工正在刷漆 打字员正在打字Aus dem obigen Programm ist leicht ersichtlich, dass Sie, wenn Sie den Arbeitsstatus mehrerer Mitarbeiter anzeigen möchten, zuerst die Mitarbeiterklasse definieren, die Arbeit des Mitarbeiters in der Mitarbeiterklasse definieren und dann eine elseif-Anweisung hinzufügen müssen die Funktion printworking(), um zu überprüfen, von welcher Mitarbeiterklasse das Objekt eine Instanz ist. Dies ist in der Praxis höchst unerwünscht. Wenn zu diesem Zeitpunkt Polymorphismus verwendet wird, kann dieses Problem leicht gelöst werden. Sie können zunächst eine übergeordnete Mitarbeiterklasse erstellen. Alle Mitarbeiterklassen erben von der übergeordneten Mitarbeiterklasse und erben alle Methoden und Attribute der übergeordneten Klasse. Erstellen Sie dann eine „ist ein“-Beziehung in der Mitarbeiterklasse, um festzustellen, ob es sich um einen legalen Mitarbeiter handelt. 【Beispiel】Das obige Beispiel wurde unter Verwendung von Polymorphismus umgeschrieben. Der Code wird unten angezeigt.
class employee{//定义员工父类 protected function working(){//定义员工工作,需要在子类的实现 echo "本方法需要在子类中重载!"; } } class painter extends employee{//定义油漆工类 public function working(){//实现继承的工作方法 echo "油漆工正在刷漆!\n"; } } class typist extends employee{//定义打字员类 public function working(){ echo "打字员正在打字!\n"; } } class manager extends employee{//定义经理类 public function working(){ echo "经理正在开会!"; } } function printworking($obj){//定义处理方法 if($obj instanceof employee){//若是员工对象,则显示其工作状态 $obj->working(); }else{//否则显示错误信息 echo "Error: 对象错误!"; } } printworking(new painter());//显示油漆工的工作 printworking(new typist());//显示打字员的工作 printworking(new manager());//显示经理的工作Analyse: Definieren Sie im obigen Programm zunächst eine Mitarbeiter-Basisklasse und eine Methode für den Arbeitsstatus des Mitarbeiters. Definieren Sie dann drei Mitarbeiterklassen, die von der Mitarbeiterbasisklasse erben: Maler, Typist und Manager. Definieren Sie dann eine Methode zur Anzeige des Arbeitsstatus des Mitarbeiters. Und erstellen Sie bei dieser Methode eine „Ist-Eins“-Beziehung, um festzustellen, ob es sich um einen legalen Mitarbeiter handelt. Die Ergebnisse sind unten aufgeführt.
油漆工正在刷漆! 打字员正在打字! 经理正在开会!Aus dem obigen Beispiel können wir erkennen, dass Sie unabhängig von der Anzahl der hinzugefügten Mitarbeiterklassen nur die Mitarbeiterklasse und die von der übergeordneten Mitarbeiterklasse geerbten Methoden implementieren müssen. Es besteht keine Notwendigkeit, die Methode „printing()“ zu ändern, die den Arbeitsstatus des Mitarbeiters anzeigt. Zwei Methoden zur Implementierung des PHP-Polymorphismus
In PHP5 ist der Typ der Variablen undefiniert. Eine Variable kann auf jeden Typ von Wert, Zeichenfolge, Objekt, Ressource usw. verweisen. Wir können nicht sagen, dass Polymorphismus in PHP5 eine Variable ist.
Wir können nur sagen, dass in PHP5 Polymorphismus an der Typhinweisposition von Methodenparametern angewendet wird. Jedes Unterklassenobjekt einer Klasse kann die Typanforderung mit dem aktuellen Typ als Typhinweis erfüllen. Alle Klassen, die diese Schnittstelle implementieren, können die Anforderungen an Methodenparameter erfüllen, indem sie den Schnittstellentyp als Typhinweis verwenden. Einfach ausgedrückt hat eine Klasse die Identität ihrer übergeordneten Klasse und der implementierten Schnittstelle.Erzielen Sie Polymorphismus durch die Implementierung von Schnittstellen
<?php interface User{ // User接口 public function getName(); public function setName($_name); } class NormalUser implements User { // 实现接口的类. private $name; public function getName(){ return $this->name; } public function setName($_name){ $this->name = $_name; } } class UserAdmin{ //操作. public static function ChangeUserName(User $_user,$_userName){ $_user->setName($_userName); } } $normalUser = new NormalUser(); UserAdmin::ChangeUserName($normalUser,"Tom");//这里传入的是 NormalUser的实例. echo $normalUser->getName(); ?>Verwenden Sie Schnittstellen und Komposition, um Mehrfachvererbung zu simulieren.
Simulieren Sie Mehrfachvererbung durch Komposition.
Mehrfachvererbung wird in PHP nicht unterstützt, wenn wir die Methoden mehrerer Klassen verwenden möchten, um die Wiederverwendung von Code zu erreichen, gibt es eine Möglichkeit?那就是组合。在一个类中去将另外一个类设置成属性。
下面的例子,模拟了多重继承。
接口实例
写一个概念性的例子。 我们设计一个在线销售系统,用户部分设计如下: 将用户分为,NormalUser, VipUser, InnerUser 三种。要求根据用户的不同折扣计算用户购买产品的价格。并要求为以后扩展和维护预留空间。
<?php interface User { public function getName(); public function setName($_name); public function getDiscount(); } abstract class AbstractUser implements User { private $name = ""; protected $discount = 0; protected $grade = ""; function construct($_name) { $this->setName($_name); } function getName() { return $this->name; } function setName($_name) { $this->name = $_name; } function getDiscount() { return $this->discount; } function getGrade() { return $this->grade; } } class NormalUser extends AbstractUser { protected $discount = 1.0; protected $grade = "Normal"; } class VipUser extends AbstractUser { protected $discount = 0.8; protected $grade = "VipUser"; } class InnerUser extends AbstractUser { protected $discount = 0.7; protected $grade = "InnerUser"; } interface Product { function getProductName(); function getProductPrice(); } interface Book extends Product { function getAuthor(); } class BookOnline implements Book { private $productName; protected $productPrice; protected $Author; function construct($_bookName) { $this->productName = $_bookName; } function getProductName() { return $this->productName; } function getProductPrice() { $this->productPrice = 100; return $this->productPrice; } public function getAuthor() { $this->Author = "chenfei"; return $this->Author; } } class Productsettle { public static function finalPrice(User $_user, Product $_product, $number) { $price = $_user->getDiscount() * $_product->getProductPrice() * $number; return $price; } } $number = 10; $book = new BookOnline(" 设计模式 "); $user = new NormalUser("tom"); $price = Productsettle::finalPrice($user, $book, $number); $str = "您好,尊敬的" . $user->getName() . "<br />"; $str .= "您的级别是" . $user->getGrade() . "<br />"; $str .= "您的折扣是" . $user->getDiscount() . "<br />"; $str .= "您的价格是" . $price; echo $str; ?>
推荐学习:《PHP视频教程》
Das obige ist der detaillierte Inhalt vonWas bedeutet Polymorphismus in PHP?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!