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(){ }
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);
$b = B::getInstance();
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);
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.