Heim >Backend-Entwicklung >PHP-Tutorial >PHP-Designmuster-Singleton-Muster

PHP-Designmuster-Singleton-Muster

高洛峰
高洛峰Original
2016-11-15 13:39:021092Durchsuche

Einführung

Das Singleton-Muster bezieht sich auf ein Entwurfsmuster, bei dem eine Klasse in der gesamten Anwendung nur eine Objektinstanz hat. Es wird normalerweise verwendet, um Objekte zu erstellen, sicherzustellen, dass es nur eine Instanz einer Klasse gibt, sich selbst zu instanziieren und diese Instanz dem gesamten System bereitzustellen.

Es handelt sich um ein gängiges Entwurfsmuster. In Computersystemen werden Thread-Pools, Caches, Protokollobjekte, Dialogfelder, Drucker, Datenbankoperationen und Grafikkartentreiber häufig als Singletons entworfen.

Funktionen

Eine Klasse hat eine und nur eine Instanz in der gesamten Anwendung

Die Klasse muss diese Instanz selbst erstellen

Sie muss diese Instanz bereitstellen auf das gesamte System selbst

Funktion

Der größte Effekt der Verwendung des Singleton-Modus besteht darin, den Systemaufwand zu reduzieren und Ressourcen zu sparen. Wenn wir beispielsweise PHP für die tägliche Entwicklung verwenden, müssen wir häufig mehrmals eine Verbindung zu verschiedenen relationalen und nicht relationalen Datenbanken wie MySQL oder Redis herstellen. Wenn wir nicht den Singleton-Modus verwenden, müssen wir zum Erstellen mehrere Male eine neue Verbindung herstellen neue Instanzen, die viele Speicherressourcen und Systemressourcen verbrauchen.

Wichtige Punkte

1. Eine statische Mitgliedsvariable, die die einzige Instanz der Klasse enthält, ist erforderlich

private static $_instance;

2. Konstruktoren und Klonfunktionen müssen als privat deklariert werden externe Programme verhindern Die neue Klasse verliert somit die Bedeutung des Singleton-Modus

// 私有化构造方法,防止new实例
private function __construct()
{
    $this->_db = pg_connect('demo');
}
// 覆盖__clone()方法,禁止克隆
private function __clone()
{
}

3. Für den Zugriff auf diese Instanz muss eine öffentliche statische Methode (normalerweise die getInstance-Methode) bereitgestellt werden, wodurch eine Referenz auf die einzige zurückgegeben wird Instanz

// 用于返回对象实例的公共静态方法
public static function getInstance()
{
    // 判断当前实例是否已经创建
    if (!(self::$_instance instanceof self) ) {
        // 如果没有,则创建
        self::$_instance = new self();
    }
    // 最终返回实例
    return self::$_instance;
}

Erklärung

Jetzt nehme ich eine MySQL-Operationsklasse als Beispiel, um zu zeigen, wie man sie schreibt.

Code:

<?php

/**
 * Class DB 数据库操作类
 */
class Db
{
    private $_db;
    private static $_instance;

    // 私有化构造方法,防止外部new实例
    private function __construct(...)
    {
        // 这里主要用于连接数据库,细节此处省略
        $this->_db = pg_connect(...); 
    }

    // 覆盖__clone()方法,禁止克隆
    private function __clone() 
    {
        
    }
    
    // 返回对象实例
    public static function getInstance()
    {
        // 判断是否存在对象实例
        if(! (self::$_instance instanceof self) ) {
            // 不存在则创建保存
            self::$_instance = new self();
        }
        // 返回对象实例
        return self::$_instance;
    }

    // 其他方法
    public function addUserInfo(...)
    {
        
    }

    // 其他方法
    public function getUserInfo(...)
    {

    }
}


// 演示
$db = Db::getInstance();
$db->addUserInfo(...);
$db->getUserInfo(...);

Zusammenfassung

Nachdem ich so viel über das Singleton-Muster gesprochen habe, bedeutet das nicht, dass es keine Mängel aufweist. Im Folgenden liste ich die Verwendung von Singletons auf Schauen wir uns die Vor- und Nachteile des Modells an und Sie können es entsprechend Ihren tatsächlichen Anforderungen verwenden.

Vor- und Nachteile des Singleton-Musters:

Vorteile:

Verbesserung des Designs des Systems

Es ist eine Verbesserung gegenüber globalen Variablen

Systemressourcen-Overhead sparen

Nachteile:

Schwer zu debuggen

Versteckte Abhängigkeiten

Ein Singleton kann nicht mit falschem Datentyp überschrieben werden


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