Heim  >  Artikel  >  Backend-Entwicklung  >  [Entwurfsmuster] Anwendungsszenarien und Implementierung des PHP-Singleton-Musters

[Entwurfsmuster] Anwendungsszenarien und Implementierung des PHP-Singleton-Musters

大鹏
大鹏Original
2020-06-02 00:58:483408Durchsuche

Zusammenfassung

Was ist das Singleton-Muster?

Eine Klasse darf nur ein Objekt (oder eine Instanz) erstellen, dann ist diese Klasse eine Singleton-Klasse. Dieses Entwurfsmuster wird als Singleton-Entwurfsmuster oder kurz Singleton-Muster bezeichnet.

Warum Singleton verwenden?

  1. Behandeln Sie Ressourcenzugriffskonflikte.

    Zum Beispiel: die Funktion zum Drucken von Protokollen in eine Datei.

  2. stellt eine weltweit einzigartige Klasse dar.

Wenn einige Daten aus einem Geschäftskonzept nur in einer Kopie im System gespeichert werden sollen, ist es besser, sie als Singleton-Klasse zu entwerfen. Beispiel: Eindeutiger Generator für aufsteigende ID-Nummern.

Implementierungsmethode

Es sind drei Schritte erforderlich, um den Singleton-Modus von PHP zu implementieren

* Eine statische Mitgliedsvariable, die zum Speichern der Klasse verwendet wird.

* Um das Erstellen oder Klonen von Objekten zu verhindern, müssen __construct und __clone als privat deklariert werden.

* Eine öffentliche statische Methode für den Zugriff auf diese Instanz, normalerweise getInstance

class single
{
    private static  $instance ;
    private function __construct(){}
    private function __clone(){}
    public static function getInstance() {
        if (empty(self::$instance)) {
            self::$instance = new single();
        }
        return self::$instance;
    }
}

Fügen Sie der Singleton-Klasse eine Methode hinzu, um die ID abzurufen. Es erscheint ein weltweit eindeutiger ID-Nummerngenerator.

class single
{
    private  $id = 0;
    private static  $instance ;
    private function __construct(){}
    private function __clone(){}
    public static function getInstance() {
        if (empty(self::$instance)) {
            self::$instance = new single();
        }
        return self::$instance;
    }
    public function getId() {
        
        return $this->id++;
        
    }
}

Es ist wirklich einwandfrei, was passiert also bei Multithreading?

Implementieren der einzigen einzelnen Instanz eines Threads

Ich muss den Unterschied zwischen ts- und nts-Versionen von PHP, nts, erwähnen (Nicht Thread-sicher) Single-Thread-Konstruktion, gemeinsame Cache-Daten zwischen Threads. ts (Thread Safe) ist mit Multithreading-Funktionen ausgestattet und verwendet unterschiedliche Datenkopien zwischen mehreren Threads.

Bei Verwendung der ts-Version von PHP wird automatisch auf den Thread-sicheren Modus aktualisiert. Die pthreads-Erweiterung kann nur auf der ts-Version von PHP installiert werden.

Die letzte in pecl enthaltene Version von pthreads basiert ebenfalls auf php7.0. Wenn Sie interessiert sind, können Sie nur auf 7.0 gehen, um den Verlauf zu verpassen.

Ich habe die pthreads-Erweiterung unter der Version php-7.0.9-Win32-VC14-x64 installiert.

Im Fall von Multithreading ändert sich der Umfang des Singletons von Nur-Prozess zu Nur-Thread.

require 'single.php';
class Request extends Thread {
    public $url;
    public function __construct($url) {
        $this->url = $url;
    }
    public function run() {
        echo single::getInstance()->getId();
        echo "\n";
    }
}
$chG = new Request("www.google");
$chG ->start();
$chG->join();
echo $chG->getThreadId();
echo "\n";
$chB = new Request("www.baidu");
$chB ->start();
$chB->join();
echo $chB->getThreadId();
echo "\n";

Hier werden zwei Threads erstellt, aber die ID ab 0 kann in beiden Ausführungen abgerufen werden, was darauf hinweist, dass die einzelnen Klassen in den beiden Threads zwei verschiedene Singleton-Objekte sind.

Zusammenfassung

Es sind drei Schritte erforderlich, um den Singleton-Modus von PHP zu implementieren

* A Statische Mitgliedsvariablen werden zum Speichern von Klassen verwendet.

* __construct und __clone werden als privat deklariert, um das Erstellen oder Klonen zu verhindern.

* Eine statische Methode, normalerweise getInstance, die für den Zugriff auf diese Instanz verwendet wird.

Ich habe noch nie Multithreading in PHP verwendet. Es scheint ein Punkt zu sein, an dem es kein Zurück mehr gibt.

Das obige ist der detaillierte Inhalt von[Entwurfsmuster] Anwendungsszenarien und Implementierung des PHP-Singleton-Musters. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

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