Dans l'article précédent "Une analyse approfondie du modèle de méthode modèle en PHP", nous avons présenté le modèle de méthode modèle en PHP. Cet article vous amènera à comprendre le modèle singleton dans les modèles de conception PHP.
Le modèle singleton est définitivement classé au premier rang parmi les modèles de conception d'entretien couramment utilisés et fréquemment demandés. D’une part, c’est assez simple et peut être expliqué en quelques mots. D'un autre côté, il est assez complexe. Sa mise en œuvre ne se fait pas seulement sous une forme unique, mais nécessite également de prendre en compte la question du verrouillage multithread dans les langages asynchrones tels que Java. Ainsi, pendant l'entretien, ne pensez pas que l'intervieweur se détendra lorsqu'il posera la question sur le modèle singleton. Ce modèle peut vraiment être profond ou superficiel, et il peut extrêmement refléter le niveau d'un développeur. Car tant que vous travaillez pendant un certain temps, vous entrerez inévitablement en contact avec ce modèle.
Définition GoF : assurez-vous qu'une classe n'a qu'une seule instance et fournissez un point d'accès global pour y accéder.
Diagramme de classe GoF
Implémentation du code
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; } }
Oui, le noyau est une telle classe singleton, rien d'autre. Laissez la variable statique se sauvegarder après l'instanciation. Lorsque cet objet est nécessaire, appelez la méthode GetInstance() pour obtenir l'objet globalement unique. En appelant
$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;
côté client, nous constaterons que singletonB est exactement le même objet.
Code complet : https://github.com/zhangyue0503/. designpatterns-php/blob/master/21.singleton/source/singleton.php
Exemple
Code source complet : https://github.com/zhangyue0503/designpatterns-php/blob/master/21.singleton/source/singleton-http.php
Instructions<?php class HttpService{ private static $instance; public function GetInstance(){ if(self::$instance == NULL){ self::$instance = new HttpService(); } return self::$instance; } public function Post(){ echo '发送Post请求', PHP_EOL; } public function Get(){ echo '发送Get请求', PHP_EOL; } } $httpA = new HttpService(); $httpA->Post(); $httpA->Get(); $httpB = new HttpService(); $httpB->Post(); $httpB->Get(); var_dump($httpA == $httpB);Copier après la connexion
- Est-ce encore très simple ? Je ne parlerai pas davantage de cette forme de singleton ici. Parlons de plusieurs autres formes de singletons
Dans les langages statiques comme Java, les variables statiques peuvent être directement de nouveaux objets, dans la déclaration
instance = new HttpService();. De cette façon, la méthode GetInstance() peut être omise, mais cette variable statique sera directement instanciée et occupera de la mémoire qu'elle soit utilisée ou non. Ce type de singleton est appelé le modèle singleton chinois affamé.
- Notre code et nos exemples ne sont évidemment pas du style Hungry Man, ce formulaire est appelé style Lazy Man. Vous devez utiliser activement GetInstance() pour l'obtenir, puis je créerai l'objet.
- Dans les applications multithread, telles que le multi-threading Java ou l'utilisation de swoole en PHP, le problème de la création répétée se produira et les objets créés plusieurs fois ne sont pas le même objet. À l’heure actuelle, la double détection est généralement utilisée pour garantir qu’il n’existe qu’un seul objet global. Vous pouvez trouver le code spécifique vous-même. Il n'y aura aucun problème avec le style Hungry Han. Le style Hungry Han lui-même a déjà attribué une valeur à l'attribut statique et ne changera plus.
- Une autre façon consiste à créer des classes internes statiques. Cela est rarement observé et son taux d’utilisation des ressources est élevé. Placez la variable statique à l'intérieur de la méthode afin qu'elle devienne une variable dans la méthode au lieu d'une variable dans la classe. Il permet à un objet singleton d'appeler ses propres méthodes et propriétés statiques.
Adresse originale : https://juejin.cn/post/6844903990585458702
Auteur : Hardcore Project Manager
Apprentissage recommandé : "Tutoriel vidéo PHP"
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!