Heim  >  Artikel  >  Backend-Entwicklung  >  Erfahren Sie in einem Artikel mehr über das Prototypmuster in PHP

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

青灯夜游
青灯夜游nach vorne
2021-07-07 19:22:582963Durchsuche

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();
}

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 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

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
<?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();

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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:juejin.cn. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen