Inhaltsverzeichnis
Gof-Klassendiagramm und Erklärung
Beispiel
Heim Backend-Entwicklung PHP-Tutorial Erfahren Sie in einem Artikel mehr über das Prototypmuster in PHP

Erfahren Sie in einem Artikel mehr über das Prototypmuster in PHP

Jul 07, 2021 pm 07:22 PM
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.

Erfahren Sie in einem Artikel mehr über das Prototypmuster 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:

Erfahren Sie in einem Artikel mehr über das Prototypmuster in PHP

Code-Implementierung:

abstract class Prototype
{
    public $v = 'clone' . PHP_EOL;

    public function __construct()
    {
        echo 'create' . PHP_EOL;
    }

    abstract public function __clone();
}
Nach dem Login kopieren

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()
    {
    }
}
Nach dem Login kopieren

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();
Nach dem Login kopieren

Der Client verwendet Klonen zum Kopieren von Erfahren Sie in einem Artikel mehr über das Prototypmuster in PHPp2 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
Nach dem Login kopieren

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:

Erfahren Sie in einem Artikel mehr über das Prototypmuster in PHP

完整源码:https://link.juejin.cn/?target=https%3A%2F%2Fgithub.com%2Fzhangyue0503%2Fdesignpatterns-php%2Fblob%2Fmaster%2F08.prototype%2Fsource%2Fprototype-phone.php
Nach dem Login kopieren
<?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 = &#39;TD-CDMA&#39;;
$cmPhone1 = clone $cmPhone;
$cmPhone1->service_province->system = &#39;TD-CDMA1&#39;;

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 = &#39;WCDMA&#39;;
$cuPhone1 = clone $cuPhone;
$cuPhone1->rom = "128G";
$cuPhone1->service_province->system = &#39;WCDMA1&#39;;

var_dump($cuPhone);
var_dump($cuPhone1);
echo $cuPhone->service_province->getSystem();
echo $cuPhone1->service_province->getSystem();
Nach dem Login kopieren

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 Erfahren Sie in einem Artikel mehr über das Prototypmuster in PHPcmPhone 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!

Erklärung dieser Website
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

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
2 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
Repo: Wie man Teamkollegen wiederbelebt
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Abenteuer: Wie man riesige Samen bekommt
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

CakePHP-Projektkonfiguration CakePHP-Projektkonfiguration Sep 10, 2024 pm 05:25 PM

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

PHP 8.4 Installations- und Upgrade-Anleitung für Ubuntu und Debian PHP 8.4 Installations- und Upgrade-Anleitung für Ubuntu und Debian Dec 24, 2024 pm 04:42 PM

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.

CakePHP Datum und Uhrzeit CakePHP Datum und Uhrzeit Sep 10, 2024 pm 05:27 PM

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

CakePHP-Datei hochladen CakePHP-Datei hochladen Sep 10, 2024 pm 05:27 PM

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

CakePHP-Routing CakePHP-Routing Sep 10, 2024 pm 05:25 PM

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

Besprechen Sie CakePHP Besprechen Sie CakePHP Sep 10, 2024 pm 05:28 PM

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

So richten Sie Visual Studio-Code (VS-Code) für die PHP-Entwicklung ein So richten Sie Visual Studio-Code (VS-Code) für die PHP-Entwicklung ein Dec 20, 2024 am 11:31 AM

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

CakePHP erstellt Validatoren CakePHP erstellt Validatoren Sep 10, 2024 pm 05:26 PM

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

See all articles