


Erfahren Sie in einem Artikel mehr über das Prototypmuster in PHP
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-Klassendiagramm und Erklärung
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.
- Der Prototypmodus scheint dasselbe Objekt zu kopieren. Beachten Sie jedoch, dass beim Kopieren die Methode __construct () nicht aufgerufen wird. Das heißt, wenn Sie diesen Code ausführen, wird create nur einmal ausgegeben. Dies bringt auch eines der größten Merkmale des Prototypmusters zum Vorschein: Reduzierung des Aufwands für die Erstellung von Objekten.
- Basierend auf den oben genannten Eigenschaften können wir schnell eine große Anzahl identischer Objekte kopieren, beispielsweise wenn wir eine große Anzahl identischer Objekte in ein Array packen möchten.
- Wenn es sich bei den kopierten Objekten ausschließlich um Werttypattribute handelt, können wir sie beliebig ändern, ohne den Prototyp zu beeinträchtigen. Wenn Referenztypvariablen vorhanden sind, muss eine gewisse Verarbeitung in der Methode __clone() durchgeführt werden. Andernfalls wirkt sich die Änderung des Inhalts der Referenzvariablen des kopierten Objekts auf den Inhalt des Prototypobjekts aus.
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
Beispiel
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.
- Das Wichtigste im Prototypenmodus ist, auf die beiden oben genannten Punkte zu achten, während normale Wertattribute direkt kopiert werden und dieses Problem nicht auftritt. Hier sind zwei weitere Konzepte beteiligt: „Flache Kopie“ und „Tiefe Kopie“ das OriginalobjektDeep Copy verweist die Variable des Referenzobjekts auf das kopierte neue Objekt statt auf das ursprünglich referenzierte ObjektWir werden die Probleme mit Referenzen und Werten in anderen Artikeln erläutern, bitte achten Sie auf WeChat oder Nuggets-Konto
- Ursprüngliche Adresse: https://juejin.cn/post/6844903942220939272
- Autor: Hardcore Project Manager
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!

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

AI Hentai Generator
Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen

In diesem Kapitel werden wir die Umgebungsvariablen, die allgemeine Konfiguration, die Datenbankkonfiguration und die E-Mail-Konfiguration in CakePHP verstehen.

PHP 8.4 bringt mehrere neue Funktionen, Sicherheitsverbesserungen und Leistungsverbesserungen mit einer beträchtlichen Menge an veralteten und entfernten Funktionen. In dieser Anleitung wird erklärt, wie Sie PHP 8.4 installieren oder auf PHP 8.4 auf Ubuntu, Debian oder deren Derivaten aktualisieren. Obwohl es möglich ist, PHP aus dem Quellcode zu kompilieren, ist die Installation aus einem APT-Repository wie unten erläutert oft schneller und sicherer, da diese Repositorys in Zukunft die neuesten Fehlerbehebungen und Sicherheitsupdates bereitstellen.

Um in cakephp4 mit Datum und Uhrzeit zu arbeiten, verwenden wir die verfügbare FrozenTime-Klasse.

Um am Datei-Upload zu arbeiten, verwenden wir den Formular-Helfer. Hier ist ein Beispiel für den Datei-Upload.

In diesem Kapitel lernen wir die folgenden Themen im Zusammenhang mit dem Routing kennen.

CakePHP ist ein Open-Source-Framework für PHP. Es soll die Entwicklung, Bereitstellung und Wartung von Anwendungen erheblich vereinfachen. CakePHP basiert auf einer MVC-ähnlichen Architektur, die sowohl leistungsstark als auch leicht zu verstehen ist. Modelle, Ansichten und Controller gu

Visual Studio Code, auch bekannt als VS Code, ist ein kostenloser Quellcode-Editor – oder eine integrierte Entwicklungsumgebung (IDE) –, die für alle gängigen Betriebssysteme verfügbar ist. Mit einer großen Sammlung von Erweiterungen für viele Programmiersprachen kann VS Code c

Der Validator kann durch Hinzufügen der folgenden zwei Zeilen im Controller erstellt werden.
