Im vorherigen Artikel „Ein kurzer Vortrag über das Iteratormuster in PHP“ haben wir das Iteratormuster in PHP vorgestellt. Dieser Artikel führt Sie zum Verständnis des Prototypmusters in PHP.
Der Prototyp-Modus sollte eigentlich anschaulicher als Klonmodus bezeichnet werden. Sein Hauptverhalten besteht darin, Objekte zu klonen, aber es nennt das geklonte Objekt auch den ursprünglichen Prototyp, daher wird dieses Muster benannt. Ehrlich gesagt erscheint es angesichts der Verwendungsweise angemessener, ihn als Klonmodus zu bezeichnen.
GoF-Definition: Verwenden Sie Prototypinstanzen, um die zu erstellenden Objekttypen anzugeben, und erstellen Sie neue Objekte durch Kopieren dieser Prototypen
GoF-Klassendiagramm:
Code-Implementierung:
abstract class Prototype { public $v = 'clone' . PHP_EOL; public function __construct() { echo 'create' . PHP_EOL; } abstract public function __clone(); }
Zuerst definieren wir einen Prototyp durch Simulation. Hier simulieren wir hauptsächlich die __clone()-Methode. Tatsächlich ist dies eine magische Methode, die mit PHP geliefert wird. Wir müssen sie überhaupt nicht definieren. Wir müssen sie nur in der Prototypklasse implementieren. Wenn Sie das Schlüsselwort clone extern verwenden, um ein Objekt zu klonen, geben Sie diese magische Methode direkt ein. Mit dieser magischen Methode können wir Eigenschaften verarbeiten, insbesondere einige einzigartige Verarbeitungen für Referenzeigenschaften. In diesem Beispiel haben wir nur eine Variable vom Typ Wert verwendet. Das Problem der Referenztypen kann nicht abgebildet werden. Die Verarbeitung von Referenztypvariablen werden wir in einem späteren Beispiel demonstrieren.
class ConcretePrototype1 extends Prototype { public function __clone() { } } class ConcretePrototype2 extends Prototype { public function __clone() { } }
Der Prototyp der spezifischen Implementierung der Simulation ist eigentlich die Hauptimplementierung der __clone()-Methode. Wir werden dies später erklären, wenn wir uns konkrete Beispiele ansehen.
class Client { public function operation() { $p1 = new ConcretePrototype1(); $p2 = clone $p1; echo $p1->v; echo $p2->v; } } $c = new Client(); $c->operation();
Der Client verwendet Klonen zum Kopieren von p2 hat auch das gleiche $v-Attribut.
Wie wird unser mobiles Betriebssystem (man kann sich auch das Betriebssystem eines PCs vorstellen) auf dem Gerät installiert? Tatsächlich kopieren und kopieren sie ständig das ursprüngliche System. Das Beispiel Microsoft verdeutlicht dieses Problem sehr gut, weil Microsoft damals immer wieder Kopien des Windows-Betriebssystems auf CDs kopierte und diese dann an Tausende von Haushalten verkaufte (an China ist hier natürlich nichts auszusetzen). ). Auf dem chinesischen Markt haben zahlreiche Experten Windows geknackt und diese Datei kontinuierlich kopiert, bevor sie sie auf unseren Computern installiert haben. Dies gilt für die Betriebssysteme und Software verschiedener Produkte wie Mobiltelefone und Smart Devices. Unbegrenzte Kopien einer Entwicklung sind der Grund für enorme Gewinne in der Softwareindustrie. Schließlich wurde unser System von vielen Ingenieuren Tag und Nacht auf Basis des nativen Android-Systems entwickelt. Beeilen Sie sich und kopieren Sie es auf die Mobiltelefone, die bald ausgeliefert werden! !
完整代码:https://link.juejin.cn/?target=https%3A%2F%2Fgithub.com%2Fzhangyue0503%2Fdesignpatterns-php%2Fblob%2Fmaster%2F08.prototype%2Fsource%2Fprototype.php
Das Gleiche gilt für Mobiltelefone. Diesmal entwickeln wir eine Reihe maßgeschneiderter Telefone, die auf die Bedürfnisse verschiedener Betreiber zugeschnitten sind, also Pakettelefone. Um ehrlich zu sein, gibt es keinen Unterschied zwischen diesen Telefonen. Die meisten von ihnen haben die gleiche Konfiguration, aber die Trägersysteme sind unterschiedlich, und gelegentlich können einige Modelle unterschiedliche CPUs und Speicher haben. Zu diesem Zeitpunkt können wir den Prototypenmodus verwenden, um einige der Unterschiede schnell zu kopieren und nur zu ändern.
Prototyp-Modus-Produktions-Handy-Klassendiagramm:
完整源码:https://link.juejin.cn/?target=https%3A%2F%2Fgithub.com%2Fzhangyue0503%2Fdesignpatterns-php%2Fblob%2Fmaster%2F08.prototype%2Fsource%2Fprototype-phone.php
<?php interface ServiceProvicer { public function getSystem(); } class ChinaMobile implements ServiceProvicer { public $system; public function getSystem(){ return "中国移动" . $this->system; } } class ChinaUnicom implements ServiceProvicer { public $system; public function getSystem(){ return "中国联通" . $this->system; } } class Phone { public $service_province; public $cpu; public $rom; } class CMPhone extends Phone { function __clone() { // $this->service_province = new ChinaMobile(); } } class CUPhone extends Phone { function __clone() { $this->service_province = new ChinaUnicom(); } } $cmPhone = new CMPhone(); $cmPhone->cpu = "1.4G"; $cmPhone->rom = "64G"; $cmPhone->service_province = new ChinaMobile(); $cmPhone->service_province->system = 'TD-CDMA'; $cmPhone1 = clone $cmPhone; $cmPhone1->service_province->system = 'TD-CDMA1'; var_dump($cmPhone); var_dump($cmPhone1); echo $cmPhone->service_province->getSystem(); echo $cmPhone1->service_province->getSystem(); $cuPhone = new CUPhone(); $cuPhone->cpu = "1.4G"; $cuPhone->rom = "64G"; $cuPhone->service_province = new ChinaUnicom(); $cuPhone->service_province->system = 'WCDMA'; $cuPhone1 = clone $cuPhone; $cuPhone1->rom = "128G"; $cuPhone1->service_province->system = 'WCDMA1'; var_dump($cuPhone); var_dump($cuPhone1); echo $cuPhone->service_province->getSystem(); echo $cuPhone1->service_province->getSystem();
Beschreibung:
Ich habe viele Dinge gedruckt, aber die Hauptsache ist, sich das Mobiltelefon anzusehen, also den __Klon ()-Methode in CMPhone haben wir kein neues Objekt neu initialisiert. Zu diesem Zeitpunkt enthält das kopierte cmPhone dasselbe Objekt. Ja, das ist ein Problem mit der Duplizierung von Referenzen. Die Referenz kopiert lediglich die Adresse der Referenz, sie verweisen auf dasselbe Objekt. Wann
Die Attribute im service_province-Objekt in cmPhone haben sich ebenfalls geändert.
In CUPhone haben wir ein neues service_province-Objekt erstellt. Diesmal der Wert des Referenzobjekts im äußeren
cuPhone.
Empfohlenes Lernen: „PHP-Video-Tutorial
“
Das obige ist der detaillierte Inhalt vonErfahren Sie in einem Artikel mehr über das Prototypmuster in PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!