Lassen Sie uns über das Singleton-Muster in PHP sprechen

青灯夜游
Freigeben: 2023-04-10 11:54:01
nach vorne
4128 Leute haben es durchsucht

Im vorherigen Artikel „Eine ausführliche Analyse des Template-Methodenmusters in PHP“ haben wir das Template-Methodenmuster in PHP vorgestellt. Dieser Artikel führt Sie zum Verständnis des Singleton-Musters in PHP-Entwurfsmustern.

Lassen Sie uns über das Singleton-Muster in PHP sprechen

Das Singleton-Muster steht definitiv an erster Stelle unter den häufig verwendeten und häufig gestellten Interview-Designmustern. Einerseits ist es einfach genug und kann in wenigen Worten erklärt werden. Andererseits ist die Implementierung nicht nur in einer Form erforderlich, sondern muss auch das Problem der Multithread-Sperre in asynchronen Sprachen wie Java berücksichtigen. Denken Sie also nicht, dass der Interviewer sich während des Interviews entspannen wird, wenn er die Frage zum Singleton-Modell stellt. Dieses Modell kann wirklich tiefgründig oder oberflächlich sein und das Niveau eines Entwicklers extrem widerspiegeln. Denn solange man eine Zeit lang arbeitet, wird man unweigerlich mit diesem Modell in Berührung kommen.

Gof-Klassendiagramm und Erklärung

GoF-Definition: Stellen Sie sicher, dass eine Klasse nur eine Instanz hat und stellen Sie einen globalen Zugriffspunkt für den Zugriff darauf bereit.

GoF-Klassendiagramm

Lassen Sie uns über das Singleton-Muster in PHP sprechen

Code-Implementierung

class Singleton
{
    private static $uniqueInstance;
    private $singletonData = '单例类内部数据';

    private function __construct()
    {
        // 构造方法私有化,外部不能直接实例化这个类
    }

    public static function GetInstance()
    {
        if (self::$uniqueInstance == null) {
            self::$uniqueInstance = new Singleton();
        }
        return self::$uniqueInstance;
    }

    public function SingletonOperation(){
        $this->singletonData = '修改单例类内部数据';
    }

    public function GetSigletonData()
    {
        return $this->singletonData;
    }

}
Nach dem Login kopieren

Ja, der Kern ist so eine Singleton-Klasse, sonst nichts. Lassen Sie die statische Variable nach der Instanziierung selbst speichern. Wenn dieses Objekt benötigt wird, rufen Sie die Methode GetInstance() auf, um das global eindeutige Objekt abzurufen. Wenn wir

$singletonA = Singleton::GetInstance();
echo $singletonA->GetSigletonData(), PHP_EOL;

$singletonB = Singleton::GetInstance();

if ($singletonA === $singletonB) {
    echo '相同的对象', PHP_EOL;
}
$singletonA->SingletonOperation(); // 这里修改的是A
echo $singletonB->GetSigletonData(), PHP_EOL;
Nach dem Login kopieren

auf der Clientseite aufrufen, werden wir feststellen, dass Lassen Sie uns über das Singleton-Muster in PHP sprechensingletonB genau dasselbe Objekt ist.

  • Ja, wie Sie dem Code entnehmen können, besteht der größte Nutzen von Singletons darin, unsere Objekte weltweit einzigartig zu machen.
  • Welche Vorteile hat es also, global zu sein? Die Erstellung einiger Klassen ist sehr kostspielig und wir müssen nicht jedes Mal neue Objekte verwenden. Sie können als ein Objekt wiederverwendet werden. Sie haben keine Eigenschaften oder Status, die geändert werden müssen, sondern stellen nur einige öffentliche Dienste bereit. Zum Beispiel Datenbankbetriebsklassen, Netzwerkanforderungsklassen, Protokollbetriebsklassen, Konfigurationsverwaltungsdienste usw. Ein Interviewer fragte einmal: Ist ein Singleton der einzige in PHP? Liegt es unter einem Prozess, also unter einem fpm, ist es natürlich eindeutig. Das ist definitiv nicht der einzige unter den mehreren FPMs, die Nginx gleichzeitig abruft. Ein Prozess pro Prozess!
  • Vorteile des Singleton-Musters: Kontrollierter Zugriff auf eindeutige Instanzen; ermöglicht eine flexiblere Verfeinerung von Operationen und Präsentationen;
  • Laravel verwendet das Singleton-Muster im IoC-Containerteil. Wir werden den Containerteil in zukünftigen Artikeln der Laravel-Reihe erläutern. Wir finden die Singleton-Methode in der Klasse IlluminateContainerContainer. Es ruft die getClosure-Methode in der Bind-Methode auf. Wenn Sie weiterverfolgen, werden Sie feststellen, dass sie schließlich die Make- oder Build-Methode des Containers aufrufen, um die Klasse zu instanziieren. Unabhängig von der Make- oder Build-Methode verfügen sie über ein Singleton-Urteil, das heißt, um zu beurteilen, ob die Klasse vorhanden ist wurde instanziiert oder ist bereits im Container vorhanden. if (!$reflector->isInstantiable()) im Build.
Das Unternehmen wird immer größer, aber wir haben nur eine Kopie (Singleton-Klasse) aller Dienstpläne, die in unserem OA-System gespeichert ist. Ich befürchte, dass es zu Verwirrung kommt, wenn jede Abteilung ihren eigenen Dienstplan hat. Wenn die Aktualisierung beispielsweise nicht rechtzeitig erfolgt, werden neu hinzugekommene oder ausgeschiedene Mitarbeiter aus anderen Abteilungen übersehen. Andere Abteilungen können bei Bedarf den gesamten Dienstplan einsehen oder auf der Grundlage des gesamten Dienstplans Abschnitte ihrer eigenen Abteilung erstellen und ändern. Was sie jedoch im OA-System tatsächlich ändern, ist der Inhalt des allgemeinen Dienstplans. Was jeder verwaltet, ist tatsächlich der einzige echte Dienstplan, der auf dem OA-Systemserver gespeichert ist. Vollständiger Code: https://github.com/zhangyue0503/ designpatterns-php/blob/master/21.singleton/source/singleton.php

Beispiel

Da ich oben gesagt habe, gefallen mir sowohl die Datenbankoperationsklasse als auch die Netzwerkanforderungsklasse. Wenn wir den Singleton-Modus verwenden, werden wir es tun Implementieren Sie die Entwicklung des Singleton-Modus der HTTP-Anforderungsklasse. Ich erinnere mich, dass es vor langer Zeit, als ich an Android arbeitete, nicht so viele Frameworks gab wie heute, die alle einzeln gekapselt waren und die meisten Online-Tutorials den Singleton-Modus übernahmen.

Cache-Klassendiagramm

Vollständiger Quellcode: https://github.com/zhangyue0503/designpatterns-php/blob/master/21.singleton/source/singleton-http.phpLassen Sie uns über das Singleton-Muster in PHP sprechen
rrree
Anleitung

  • Ist es immer noch sehr einfach? Ich werde hier nicht mehr über diese Form von Singletons sprechen.
  • In statischen Sprachen wie Java können statische Variablen direkt neue Objekte sein die Deklaration Lassen Sie uns über das Singleton-Muster in PHP sprechen

    instance = new HttpService();. Auf diese Weise kann die Methode GetInstance() weggelassen werden, aber diese statische Variable wird direkt instanziiert und belegt Speicher, unabhängig davon, ob sie verwendet wird oder nicht. Diese Art von Singleton wird als hungriges chinesisches Singleton-Muster bezeichnet.

  • Unser Code und unsere Beispiele sind offensichtlich nicht im Hungry-Man-Stil, diese Form wird als Lazy-Man-Stil bezeichnet. Sie müssen GetInstance() aktiv verwenden, um es abzurufen, und dann erstelle ich das Objekt.
  • In Multithread-Anwendungen wie Java-Multithreading oder der Verwendung von Swoole in PHP tritt das Problem der wiederholten Erstellung auf und die mehrfach erstellten Objekte sind nicht dasselbe Objekt. Derzeit wird im Allgemeinen die Doppelerkennung verwendet, um sicherzustellen, dass nur ein globales Objekt vorhanden ist. Sie können den spezifischen Code selbst finden. Mit dem Hungry Han-Stil wird es kein Problem geben. Der Hungry Han-Stil selbst hat dem statischen Attribut bereits einen Wert zugewiesen und wird sich nicht mehr ändern.
  • Eine andere Möglichkeit besteht darin, statische innere Klassen zu erstellen. Dies kommt selten vor und die Ressourcenauslastung ist hoch. Fügen Sie die statische Variable in die Methode ein, sodass die statische Variable zu einer Variablen innerhalb der Methode und nicht zu einer Variablen in der Klasse wird. Es ermöglicht einem Singleton-Objekt, seine eigenen statischen Methoden und Eigenschaften aufzurufen.

Ursprüngliche Adresse: https://juejin.cn/post/6844903990585458702

Autor: Hardcore Project Manager

Empfohlenes Lernen: „PHP-Video-Tutorial

Das obige ist der detaillierte Inhalt vonLassen Sie uns über das Singleton-Muster in PHP sprechen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:juejin.cn
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage