Heim  >  Artikel  >  Backend-Entwicklung  >  Ausführliche Erklärung der drei klassischen Muster in PHP

Ausführliche Erklärung der drei klassischen Muster in PHP

藏色散人
藏色散人nach vorne
2019-11-15 13:58:112617Durchsuche

Singleton-Modus

Die Bedeutung des Singleton-Modus:

Als Objekterstellungsmodus stellt der Singleton-Modus sicher, dass nur eine bestimmte Klasse vorhanden ist Eine Instanz, die sich selbst instanziiert und diese Instanz global dem gesamten System zur Verfügung stellt. Es erstellt keine Kopie der Instanz, sondern gibt einen Verweis auf die intern in der Singleton-Klasse gespeicherte Instanz zurück.

Drei Elemente des Singleton-Musters:

1. Statische Variablen, die die einzige Instanz einer Klasse enthalten.

2. Der Konstruktor und die Klonfunktion müssen privat sein und zur Instanziierung extern platziert werden, daher hat der Singleton-Modus keine Bedeutung.

3. Stellen Sie eine öffentliche statische Methode bereit, auf die extern zugegriffen werden kann. Diese Methode gibt die einzige Instanz der Klasse zurück.

Die Bedeutung des Singleton-Modus:

Die Anwendung in PHP erfolgt hauptsächlich in Datenbankanwendungen, daher gibt es bei der Verwendung eine große Anzahl von Datenbankoperationen objektorientiert Wenn Sie auf diese Weise entwickeln und den Singleton-Modus verwenden, können Sie eine große Anzahl von Ressourcen vermeiden, die durch neue Vorgänge verbraucht werden. Es geht nicht nur darum, Systemressourcen zu sparen, aber es kann eine wiederholte Instanziierung vermeiden, da PHP bei jeder Instanziierung einer Klasse die entsprechenden Ressourcen bereinigt und sie bei erneuter Verwendung erneut instanziiert.

Szenarien für die Verwendung des Singleton-Modus:

1. Datenbankoperationen, wodurch neue Operationen auf dem Datenpfad reduziert werden, wodurch der Verbrauch von Speicherressourcen und Systemressourcen reduziert wird.

2. In einem System sind Konfigurationsressourcen global. Durch die Verwendung des Singleton-Modus kann auch der Speicherverbrauch und die Systemressourcen reduziert werden, die jedes Mal auftreten.

Codedemonstration:

<?php
class Single
{
    public static $attribute = &#39;&#39;;
    public static $instance = &#39;&#39;;
    private function __construct($attribute = &#39;个人技术&#39;)
    {
        self::$attribute = $attribute;
    }
    public static function getInstance($attribute = &#39;我是编程浪子走四方1&#39;)
    {
        if (!(self::$instance instanceof self)) self::$instance = new self($attribute);
        return self::$instance;
    }
}

Der Unterschied zwischen Singleton-Modus und Nicht-Singleton-Modus:

class Single {
    public function index() {
        return &#39;&#39;;
    }
}
$single1 = new Single();
$single2 = new Single();
var_dump($single1);
var_dump($single2);
if ($single2 === $single1) {
    echo "是同一个对象";
} else {
    echo "不是同一个对象";
}
// object(Single)#1 (0) {
// }
// object(Single)#2 (0) {
// }
// 不是同一个对象
class Single2 {
    // 1.声明一个静态属性,用户保存类的实例
    public static $instance;
    //3. 将构函数私有化,避免外部new(每new一次,就不是同一个实例)
    private function __construct() {
    }
    // 2.声明一个静态的公共方法,用户外部调用本类的实例
    public static function getInstance() {
        if (!(self::$instance instanceof self)) {
            self::$instance = new self;
        }
        return self::$instance;
    }
    //3. 克隆函数私有化,避免外部clone(每clone一次,就不是同一个实例)
    private function __clone() {
    }
}
$singleDemo1 = Single2::getInstance();
$singleDemo2 = Single2::getInstance();
var_dump($singleDemo1->getInstance());
var_dump($singleDemo2->getInstance());
if ($singleDemo1 === $singleDemo2) {
    echo "是同一个对象";
} else {
    echo "不是同一个对象";
}
// object(Single2)#3 (0) {
// }
// object(Single2)#3 (0) {
// }
// 是同一个对象

Werksmodus

Die Bedeutung des Factory-Musters:

Verantwortlich für die Generierung von Methoden anderer Objekte. Eine einfache Beschreibung besteht darin, andere Klassen oder Methoden über eine Factory-Klasse zu instanziieren.

Die Bedeutung des Factory-Musters:

Durch die Verwendung des Factory-Musters ist es möglich, die Notwendigkeit mehrerer Änderungen zur Neugestaltung derselben Klasse zu reduzieren, wenn sich die Klasse ändert .

Codedemonstration:

<?php
class Factor
{
    public static function createDB()
    {
        echo &#39;我生产了一个DB实例&#39;;
        return new DB;
    }
}
class DB
{
    public function __construct()
    {
        echo __CLASS__ . PHP_EOL;
    }
}
$db = Factor::createDB();

Registrierungsbaummodus

Die Bedeutung der Registrierungsnummer:

Registrierung Baum bedeutet, dass wir mehrere Objekte in einem Objektpool registrieren. Wenn wir sie verwenden müssen, können wir sie direkt aus dem Objektpool abrufen.

Vorteile des registrierten Nummernmodus:

Der Singleton-Modus löst das Problem, wie eine eindeutige Objektinstanz im gesamten Projekt erstellt werden kann, und der Factory-Modus löst das Problem Problem, wie man keine neue Methode zum Erstellen eines Instanzobjekts übergeben kann.

Welches Problem möchte der Registrierungsbaummodus lösen? Bevor wir uns mit diesem Thema befassen, müssen wir noch die Einschränkungen berücksichtigen, mit denen die ersten beiden Modelle derzeit konfrontiert sind.

Zunächst muss der Prozess der Erstellung eines eindeutigen Objekts im Singleton-Modus selbst beurteilt werden, dh ob das Objekt existiert. Wenn es existiert, wird das Objekt zurückgegeben; wenn es nicht existiert, wird das Objekt erstellt und zurückgegeben.

Jedes Mal, wenn Sie ein Instanzobjekt erstellen, muss eine solche Beurteilungsebene vorhanden sein.

Das Fabrikmodell berücksichtigt eher die Frage der erweiterten Wartung.

Im Allgemeinen können der Singleton-Modus und der Factory-Modus sinnvollere Objekte erzeugen. Wie kann man diese Objekte bequem aufrufen?

Darüber hinaus sind die auf diese Weise im Projekt erstellten Objekte wie verstreute Soldaten, was die Gesamtverwaltung und -anordnung unpraktisch macht. Aus diesem Grund entstand das Registrierungsbaummodell.

Egal ob Sie Objekte im Singleton-Modus, im Factory-Modus oder in einer Kombination aus beiden generieren, für mich werden sie alle in den Registrierungsbaum „eingefügt“. Wenn ich ein Objekt verwende, hole ich es einfach direkt aus dem Registrierungsbaum.

Dies ist genauso bequem und praktisch wie die Verwendung globaler Variablen. Und auch für andere Muster bietet das Registrierungsbaummuster eine sehr gute Idee.

Code-Demo:

<?php
/**
 * 单例模式
 */
class Single
{
    public static $attribute = &#39;&#39;;
    public static $instance = &#39;&#39;;
    private function __construct($attribute = &#39;个人技术&#39;)
    {
        self::$attribute = $attribute;
    }
    public static function getInstance($attribute = &#39;个人技术1&#39;)
    {
        if (!(self::$instance instanceof self)) self::$instance = new self($attribute);
        return self::$instance;
    }
}
/**
 * 工厂模式
 */
class Factory
{
    public static function createObj()
    {
        return Single::getInstance(&#39;个人技术&#39;);
    }
}
/**
 * 注册模式
 * 含义:就是将对象放在一个对象池中,使用的时候直接去对象池查找.
 * 需要如下几个操作:
 * 1.注册
 * 2.存放对象池
 * 3.获取
 * 4.销毁
 */
Class Register
{
    // 用一个数组来当做对象池,键当做对象别名,值存储具体对象
    public static $objTree = [];
    // 将对象放在对象池
    public static function set($key, $val)
    {
        return self::$objTree[$key] = $val;
    }
    // 通过对象别名在对象池中获取到对象别名
    public static function get($key)
    {
        return self::$objTree[$key];
    }
    // 通过对象别名将对象从对象池中注销
    public static function _unset($key)
    {
        unset(self::$objTree[$key]);
    }
}
Register::set(&#39;single&#39;, Factory::createObj());
$single = Register::get(&#39;single&#39;);
print_r($single);
echo $single::$attribute;

Das obige ist der detaillierte Inhalt vonAusführliche Erklärung der drei klassischen Muster in PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

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