Lassen Sie uns über den Singleton-Modus und statische Variablen in PHP sprechen

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

Lassen Sie uns über den Singleton-Modus und statische Variablen in PHP sprechen

In PHP gibt es keine statischen Variablen im allgemeinen Sinne. Im Gegensatz zu Java und C++ beträgt die Überlebenszeit statischer Variablen in PHP nur die Sitzungsperiode jedes PHP, sodass es keine statischen Variablen wie Java oder C++ geben wird.

Statische Variablen in PHP

In PHP liegt die Bedeutung statischer Variablen nur in einer bestimmten Struktur (Methode oder Klasse), ihrem Geltungsbereich befindet sich in dieser Datei.

function test(){
    static $var = 1; 
    echo $var++.'';
}
test();
test();
test();
//OutPut
//1
//2
//3
Nach dem Login kopieren

In den drei Aufrufen des Funktionstests ist die Variable $var in den drei Aufrufen vorhanden und wird jedes Mal um 1 erhöht, aber nicht gelöscht oder zurückgesetzt.
Damit wir eine statische Schlussfolgerung ziehen können Variablen existieren immer im Lebenszyklus der aktuellen Struktur. Im aktuellen Beispiel ist der Lebenszyklus der Testfunktion das aktuelle PHP-Skript, das gültig ist, solange das Programm nicht freigegeben wird.

Statische Variablen sind in der Klasse

Und in der Klasse sieht der Code so aus

class A
{
    private static $a = 1; 
    private $b = 2;
    public function add()
    {
        echo self::$a++.'';
        echo $this->b++.'';
    }
}
$class1 = new A();
$class1->add();
$class1->add();
$class2 = new A();
$class2->add();
$class2->add();
//Output
//1
//2
//2
//3
//3
//2
//4
//3
Nach dem Login kopieren

Von oben: Beurteilung Aus den laufenden Ergebnissen der Klasse haben wir auch die gleichen Ergebnisse in der Funktion erhalten

Dann ist eine Zusammenfassung, dass

Die statischen Variablen von PHP befinden sich im Lebenszyklus der entsprechenden Struktur Permanent Existenz, und der Wert bleibt konsistent, egal wie oft die Struktur aufgerufen oder instanziiert wird.

Tatsächlich ist dies der Unterschied zwischen dynamischen Variablen und statischen Variablen. Weitere Informationen finden Sie in diesem Artikel. Dynamische Variablen sind nur innerhalb der Klasse gültig, während statische Variablen innerhalb des aktuellen PHP-Skripts gelten.

Statische Variablen befinden sich im Singleton-Modus

Betrachten Sie den Singleton-Modus noch einmal

class A
{
    private static $instance = null;
    private $b = 1;
    public static function get_instance()
    {
        if(self::$instance == null){
            $classname = __CLASS__;
            self::$instance = new $classname(); 
        }
        return self::$instance;
    }
    public function add()
    {
        $this->b++;
    }
    public function show()
    {
        echo $this->b;
    }
}
$a = A::get_instance();
$b = A::get_instance();
//此处$a和$b变量完全相同!
$a->add();
$a->show();
echo '';
$b->show();
//output
//2
//2
Nach dem Login kopieren

Zu diesem Zeitpunkt aufgrund der Singleton Der Beispielmodus existiert, sodass $a und $b genau dasselbe Objekt sind. Wenn Sie also Daten zwischen ihnen teilen müssen, sind keine statischen Variablen erforderlich (Unsinn, nur Sie selbst. Denn zu jeder Zeit wird es nur diese geben Klasse in der Anwendung. Egal wie oft Sie den Singleton aufrufen, die darin enthaltenen Daten werden nicht erneut instanziiert.

Im Singleton-Modus haben statische Variablen also überhaupt keine Bedeutung . Wenn Sie nichts zu tun haben und darauf bestehen, die neue Methode zum Initialisieren des Objekts zu verwenden, ist das natürlich in Ordnung. Zu diesem Zeitpunkt ist der Singleton-Modus unterbrochen und kehrt in den Zustand ohne Singleton-Modus zurück.

Wenn Sie die Verwendung von „New“ zum Instanziieren von Objekten verhindern möchten, können Sie die __construct-Funktion der Klasse als privates Attribut festlegen.

class A
{
    private static $instance = null;
    private $b = 1;
    private function __construct()
    {
    //Code in this function
    //could not be get out of the class
    }
    public static function get_instance()
    {
        if(self::$instance == null){
            $classname = __CLASS__;
            self::$instance = new $classname();
        }
        return self::$instance;
    }
    public function add()
    {
        $this->b++;
    }
    public function show()
    {
        echo $this->b;
    }
}
$a = A::get_instance();
$b = A::get_instance();
//此处$a和$b 变量完全相同!
$a->add();
$a->show();
echo '
';
$b->show();
//output
//2
//2
  
//如果尝试用new来实例化的话
$c = new A();
//output
//Fatal error: Call to private A::__construct() from invalid context in
//如果需要A类的实例化对象,只能通过开放的get_instance静态方法进行初始化
Nach dem Login kopieren

Vorteile: Der Singleton-Modus kann eine große Anzahl von „New“ vermeiden Operationen, da jede neue Operation Speicherressourcen und Systemressourcen verbraucht

Nachteile: In PHP sind alle Variablen, unabhängig davon, ob es sich um globale Variablen oder statische Mitglieder der Klasse handelt, auf Seitenebene Wenn neue Objekte erstellt werden, werden sie nach der Ausführung der Seite gelöscht. Es scheint, dass der PHP-Singleton-Modus bedeutungslos ist, daher denke ich, dass der PHP-Singleton-Modus nur für mehrere Anwendungsszenarien geeignet ist, wenn eine einzelne Seite ausgeführt wird -Level-Anforderung auftritt und die gleichen Objektressourcen gemeinsam genutzt werden müssen, ist sehr aussagekräftig

Empfohlene verwandte Tutorials: „PHP-Tutorial

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

Verwandte Etiketten:
Quelle:cnblogs.com
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