Heim > Backend-Entwicklung > PHP-Tutorial > API-Entwicklung Teil 3: PHP-Entwurfsmuster: Das perfekte Singleton-Muster

API-Entwicklung Teil 3: PHP-Entwurfsmuster: Das perfekte Singleton-Muster

WBOY
Freigeben: 2016-08-08 09:30:00
Original
969 Leute haben es durchsucht

Lassen Sie uns heute über das Singleton-Muster sprechen.

Da ich früher Java-Entwicklung gemacht habe, dachte ich bei der Verwendung des Singleton-Modus zuerst daran, den hungrigen chinesischen Stil zu verwenden, und dann stellte ich fest, dass es in PHP eine solche Funktion gibt: weil PHP die Zuweisung von Nicht-Basistyp--Werten zu Mitgliedsvariablen einer Klasse während der Klassendefinition nicht unterstützt. Wie Ausdrücke, neue Operationen usw. Der hungrige chinesische Stil wird also nicht funktionieren. Stattdessen wollte ich die Atomizität dieses Singleton-Modus sicherstellen und stellte fest, dass es in PHP keine Thread-Sicherheitsprobleme wie in JAVA gibt. Hey, denkst du, PHP ist gut? OK, dann probieren wir den Lazy-Singleton-Modus von PHP aus.

Lassen Sie mich nicht zuerst darüber sprechen, sondern meine erste Version des Singleton-Modus-Codes vorstellen:

    // 定义私有静态变量.此种方式为:懒汉式单例(PHP中只有这种方式)
    private static $instance = null;
    // 私有化构成方法
    private function __construct(){
    }
    // 提供获取实例的公共方法
    public static function getInstance(){
        if(!(self::$instance instanceof self)){
            self::$instance = new self();
        }
        return self::$instance;
    }
    
    // 私有__clone方法,禁止复制对象
    private function __clone(){

    }
Nach dem Login kopieren
OK, das Der Code sieht perfekt aus, mit Kommentaren und Formatierungen, sodass es keine Probleme gibt. Aber als ich es benutzte, entdeckte ich ein Problem

Meine Klasse A befindet sich im Singleton-Modus, und dann erbt meine Klasse B von Klasse A, und dann rufe ich die folgende Methode auf:

$a = A::getInstance();
$b = B::getInstance();
var_dump($a === $b);
Nach dem Login kopieren
Das Ausgabeergebnis ist: bool(true)
Was bedeutet dieses Ausgabeergebnis? Das heißt: Nachdem B von A geerbt hat, besteht meine ursprüngliche Absicht darin, dass B auch ein Singleton-Modus wird. Dann erben und verwalten nur A und B, und ihre Objekte sollten nicht gleich sein. was nur bedeuten kann: Das durch
$b = B::getInstance();
Nach dem Login kopieren
erhaltene Objekt ist immer noch ein Objekt der Klasse A. Was ist also los?

Das Problem liegt beim Selbst. Der Selbstbezug wird bei der Definition der Klasse bestimmt. Das heißt, wenn A B erbt, zeigt sein Selbstbezug immer noch auf A. Um dieses Problem zu lösen, wurde in PHP 5.3 die späte statische Bindungsfunktion eingeführt. Einfach ausgedrückt erfolgt der Zugriff auf statische Methoden oder Variablen über das Schlüsselwort static. Im Gegensatz zu self werden statische Referenzen zur Laufzeit ermittelt. Also schreiben wir einfach unseren Code um, damit der Singleton-Modus wiederverwendet werden kann.

class C
{
    protected static $_instance = null;
    protected function __construct(){
    }
    protected function __clone(){
    }
    public function getInstance(){
        if (static::$_instance === null) {
            static::$_instance = new static;
        }
        return static::$_instance;
    } 
}
class D extends C{
    protected static $_instance = null;
}
$c = C::getInstance();
$d = D::getInstance();
var_dump($c === $d);
Nach dem Login kopieren
Die Ausgabe zu diesem Zeitpunkt lautet: bool(false)

Dann können Sie dies erreichen, solange Sie diesen Singleton-Modus erben, dann befinden sich auch seine Unterklassen im Singleton-Modus. Dadurch kann eine perfekte Wiederverwendung erreicht werden, ohne jedes Mal, wenn Sie den Singleton-Modus benötigen, so viel wiederholten Code schreiben zu müssen. Beachten Sie, dass die obige Methode nur in PHP 5.3 verwendet werden kann. Für frühere Versionen von PHP ist es besser, für jede Singleton-Klasse eine getInstance()-Methode zu schreiben.

Das Obige stellt den dritten Teil der API-Entwicklung vor: PHP-Designmuster: Das perfekte Singleton-Muster, einschließlich Aspekten des Inhalts. Ich hoffe, es wird für Freunde hilfreich sein, die sich für PHP-Tutorials interessieren.

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